Jak uzyskać bieżący czas jako datę i godzinę

263

Zacząłem od placu zabaw. Próbuję stworzyć prostą aplikację.

Utworzyłem obiekt daty taki jak ten:

var date = NSDate()

Jak mogę uzyskać bieżącą godzinę? W innych językach mogę zrobić coś takiego:

var hour = date.hour

Ale nie mogę znaleźć żadnych takich właściwości / metod. Znalazłem metodę dateWithCalendarFormat. Czy powinienem tego użyć? Jeśli tak to jak?

JOSEFtw
źródło

Odpowiedzi:

389

Aktualizacja dla Swift 3:

let date = Date()
let calendar = Calendar.current
let hour = calendar.component(.hour, from: date)
let minutes = calendar.component(.minute, from: date)

Robię to:

let date = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components(.CalendarUnitHour | .CalendarUnitMinute, fromDate: date)
let hour = components.hour
let minutes = components.minute

Zobacz to samo pytanie w celu-c Jak uzyskać godziny i minuty z NSDate?

W porównaniu z odpowiedzią Nate'a dostaniesz liczby z tym, a nie ciągi… wybierz swój wybór!

noliv
źródło
Witam, dziękuję za odpowiedź, na przykład jeśli minuta jest mniejsza niż dwie znaki, jak mogę ją zwrócić za pomocą dwóch znaków, takich jak „04”
Wczoraj Muratov
2
@YestayMuratov Ta przydatna strona internetowa zawiera wszystkie możliwe sposoby formatowania daty za pomocą NSDateFormatter w Swift :) codingexplorer.com/...
Max
15
Wygląda na to, że w nowej wersji Swift (2) musisz użyć czegoś podobnego let components = calendar.components(.NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date), pionowego ukośnika nie można już tutaj używać.
Hola Soy Edu Feliz Navidad
5
let components = calendar.components(NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date)usunięto dodatkowe „.” przed NSCalendarUnit
cakes88
45
Swift 2.1: let components = calendar.components([ .Hour, .Minute, .Second], fromDate: date)
Obiwahn,
184

Testowane z Swift 4

Uzyskiwanie aktualnej daty i godziny

Możesz uzyskać bieżącą datę i godzinę tak prosto, jak to:

let currentDateTime = Date()

Jednakże, Datejest 64-bitowa liczba zmiennoprzecinkowa mierząc liczbę sekund od daty odniesienia od 1 stycznia 2001 r 00:00:00 UTC . Widzę ten numer dla bieżącej daty i godziny przy użyciu

Date().timeIntervalSinceReferenceDate

W momencie pisania tego tekstu wrócił 497626515.185066, prawdopodobnie nie dokładnie to, czego szukasz. Czytaj dalej.

Tworzenie innej daty i godziny

Metoda 1

Jeśli znasz liczbę sekund przed lub po dacie odniesienia, możesz jej użyć.

let someOtherDateTime = Date(timeIntervalSinceReferenceDate: -123456789.0) // Feb 2, 1997, 10:26 AM

Metoda 2

Oczywiście łatwiej byłoby użyć rzeczy takich jak lata, miesiące, dni i godziny (zamiast względnych sekund) do stworzenia Date. W tym celu można użyć DateComponentsdo określenia składników, a następnie Calendardo utworzenia daty. CalendarDaje Datekontekst. W przeciwnym razie, skąd miałby wiedzieć, w której strefie czasowej lub kalendarzu wyrazić to?

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 1980
dateComponents.month = 7
dateComponents.day = 11
dateComponents.timeZone = TimeZone(abbreviation: "JST") // Japan Standard Time
dateComponents.hour = 8
dateComponents.minute = 34

// Create date from components
let userCalendar = Calendar.current // user calendar
let someDateTime = userCalendar.date(from: dateComponents)

Inne skróty stref czasowych można znaleźć tutaj . Jeśli pozostawisz to pole puste, domyślnie będzie używana strefa czasowa użytkownika.

Metoda 3

Najbardziej zwięzłym (ale niekoniecznie najlepszym) sposobem może być użycie DateFormatter.

let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm"
let someDateTime = formatter.date(from: "2016/10/08 22:31")

Te normy techniczne Unicode pokazać inne formaty , że DateFormatterobsługuje.

Wyświetlanie daty i godziny

Metoda 1

Jeśli chcesz tylko wyświetlić niektóre składniki daty lub godziny, możesz użyć CalendarUnitdo określenia składników, z których chcesz wyodrębnić Date.

// get the current date and time
let currentDateTime = Date()

// get the user's calendar
let userCalendar = Calendar.current

// choose which date and time components are needed
let requestedComponents: Set<Calendar.Component> = [
    .year,
    .month,
    .day,
    .hour,
    .minute,
    .second
]

// get the components
let dateTimeComponents = userCalendar.dateComponents(requestedComponents, from: currentDateTime)

// now the components are available
dateTimeComponents.year   // 2016
dateTimeComponents.month  // 10
dateTimeComponents.day    // 8
dateTimeComponents.hour   // 22
dateTimeComponents.minute // 42
dateTimeComponents.second // 17

Zobacz także tę odpowiedź .

Metoda 2

Metoda 1 dała ci składniki, ale sformatowanie tych liczb dla każdego stylu, języka i regionu wymagałoby dużo pracy. I nie musisz. To już zostało zrobione dla ciebie z DateFormatterklasą.

// get the current date and time
let currentDateTime = Date()

// initialize the date formatter and set the style
let formatter = DateFormatter()
formatter.timeStyle = .medium
formatter.dateStyle = .long

// get the date time String from the date object
formatter.string(from: currentDateTime) // October 8, 2016 at 10:48:53 PM

Oto kontynuacja powyższego kodu, który pokazuje więcej opcji formatowania:

// "10/8/16, 10:52 PM"
formatter.timeStyle = .short
formatter.dateStyle = .short
formatter.string(from: currentDateTime)

// "Oct 8, 2016, 10:52:30 PM"
formatter.timeStyle = .medium
formatter.dateStyle = .medium
formatter.string(from: currentDateTime)

// "October 8, 2016 at 10:52:30 PM GMT+8"
formatter.timeStyle = .long
formatter.dateStyle = .long
formatter.string(from: currentDateTime)

// "October 8, 2016"
formatter.timeStyle = .none
formatter.dateStyle = .long
formatter.string(from: currentDateTime)

// "10:52:30 PM"
formatter.timeStyle = .medium
formatter.dateStyle = .none
formatter.string(from: currentDateTime)

Pamiętaj jednak, że dotyczy to języka angielskiego z regionem ustawionym na USA. W przypadku innych języków i regionów formatowanie będzie wyglądać inaczej.

Dalsze badanie

Suragch
źródło
58

Możesz także skorzystać z wygodnej metody NSDateFormatter, np.

func printTimestamp() {
  let timestamp = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .MediumStyle, timeStyle: .ShortStyle)
  print(timestamp)
}
printTimestamp() // Prints "Sep 9, 2014, 4:30 AM"
Scott Gardner
źródło
2
Tworzenie NSDateFormatter jest kosztowne. Powinieneś go utworzyć i użyć ponownie.
Rog
3
Swift 3: let timamp = DateFormatter.localizedString (from: Date (), dateStyle: .short, timeStyle: .short)
Brian
51

Swift naprawdę ułatwia tworzenie i używanie rozszerzeń. Tworzę sharedCode.swiftplik i umieszczam w nim wyliczenia, rozszerzenia i inne zabawne rzeczy. Stworzyłem NSDaterozszerzenie, aby dodać typową funkcjonalność, która jest pracochłonna i brzydka do pisania w kółko:

extension NSDate
{
    func hour() -> Int
    {
        //Get Hour
        let calendar = NSCalendar.currentCalendar()
        let components = calendar.components(.Hour, fromDate: self)
        let hour = components.hour

        //Return Hour
        return hour
    }


    func minute() -> Int
    {
        //Get Minute
        let calendar = NSCalendar.currentCalendar()
        let components = calendar.components(.Minute, fromDate: self)
        let minute = components.minute

        //Return Minute
        return minute
    }

    func toShortTimeString() -> String
    {
        //Get Short Time String
        let formatter = NSDateFormatter()
        formatter.timeStyle = .ShortStyle
        let timeString = formatter.stringFromDate(self)

        //Return Short Time String
        return timeString
    }
}

używając tego rozszerzenia możesz teraz zrobić coś takiego:

        //Get Current Date
        let currentDate = NSDate()

        //Test Extensions in Log
        NSLog("(Current Hour = \(currentDate.hour())) (Current Minute = \(currentDate.minute())) (Current Short Time String = \(currentDate.toShortTimeString()))")

Które na 11:51 napisałbym:

(Bieżąca godzina = 11) (Bieżąca minuta = 51) (Bieżący ciąg krótkiego czasu = 11:51)

użytkownik2266987
źródło
26

Odpowiedź Swift 2:

 let date = NSDate()
 let calendar = NSCalendar.currentCalendar()
 let components = calendar.components([.Hour, .Minute], fromDate: date)
 let hour = components.hour
 let minutes = components.minute
Matthieu Riegler
źródło
23

Szybki 4

let dateFormatter : DateFormatter = DateFormatter()
//  dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.dateFormat = "yyyy-MMM-dd HH:mm:ss"
let date = Date()
let dateString = dateFormatter.string(from: date)
let interval = date.timeIntervalSince1970

WYNIK

2018-maj-01 10:41:31

Keshav Gera
źródło
1
interwał nigdy nie jest używany.
Nerdy Bunz
11

Swift 3:

static func currentTime() -> String {
    let date = Date()
    let calendar = Calendar.current
    let hour = calendar.component(.hour, from: date)
    let minutes = calendar.component(.minute, from: date)
    return "\(hour):\(minutes)"
}

PS - nie jestem pewien, co dokładnie oznacza pytanie, określając aktualny czas (i godzinę) jako datę, ale mam nadzieję, że powyższe informacje powinny wyjaśnić wystarczająco dużo, aby odpowiedzieć na pytanie.

Charlie Seligman
źródło
Powyższa odpowiedź SaRaVaNaN DM zawierała dodatkowe „()” na końcu Calendar.current.
Charlie Seligman,
10

Dzięki Swift 5 Foundationoferuje wiele sposobów uzyskania wartości godziny z Dateobiektu. W zależności od potrzeb możesz wybrać jeden z czterech następujących fragmentów kodu placu zabaw .


# 1. Przy użyciu Calendar dateComponents(_:from:)metody

Calendarma metodę o nazwie dateComponents(_:from:). dateComponents(_:from:)ma następującą deklarację:

func dateComponents(_ components: Set<Calendar.Component>, from date: Date) -> DateComponents

Zwraca wszystkie składniki daty w oparciu o strefę czasową kalendarza.

Stosowanie:

import Foundation

let date = Date()
let dateComponents = Calendar.current.dateComponents([.hour], from: date)
let hour = dateComponents.hour
print(String(describing: hour)) // may print: Optional(13)

# 2. Przy użyciu Calendar component(_:from:)metody

Calendarma metodę o nazwie component(_:from:). component(_:from:)ma następującą deklarację:

Zwraca wartość dla jednego składnika daty.

func component(_ component: Calendar.Component, from date: Date) -> Int

Stosowanie:

import Foundation

let date = Date()
let hour = Calendar.current.component(.hour, from: date)
print(hour) // may print: 13

# 3. Korzystanie z DateFormatter dateFormatnieruchomości

DateFormatter ma właściwość o nazwie dateFormat . dateFormatma następującą deklarację:

var dateFormat: String! { get set }

Ciąg formatu daty używany przez odbiornik.

Stosowanie:

import Foundation

let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH"
let hour = dateFormatter.string(from: date)
print(hour) // may print: 13

# 4. Za pomocąDateformatter setLocalizedDateFormatFromTemplate(_:) metody

Dateformatterma metodę o nazwie setLocalizedDateFormatFromTemplate(_:).setLocalizedDateFormatFromTemplate(_:)ma następującą deklarację:

func setLocalizedDateFormatFromTemplate(_ dateFormatTemplate: String)

Ustawia format daty na podstawie szablonu przy użyciu określonych ustawień regionalnych odbiornika.

Stosowanie:

import Foundation

let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.setLocalizedDateFormatFromTemplate("HH")
let hour = dateFormatter.string(from: date)
print(hour) // may print: 13
Imanou Petit
źródło
7

jeśli potrzebujesz tylko godziny dnia

let calendar = NSCalendar.currentCalendar()
var hour = calendar.component(.Hour,fromDate: NSDate())
Bono Lv
źródło
6

W Swift 3

    let date = Date()
    let calendar = Calendar.current()

    let hour = calendar.component(.hour, from: date)
SaRaVaNaN DM
źródło
let calendar = Calendar.current; let unitFlags: Set<Calendar.Component> = Set<Calendar.Component ([.hour]); let components = calendar.dateComponents(unitFlags, from: self)
AbdulMomen عبدالمؤمن
6

Korzystanie z formatyzatora daty - Swift 3.0

//Date
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
let dateString = "Current date is: \(dateFormatter.string(from: Date() as Date))"
labelfordate.text = String(dateString)


//Time    
let timeFormatter = DateFormatter()
timeFormatter.timeStyle = .medium
let timeString = "Current time is: \(timeFormatter.string(from: Date() as Date))"
labelfortime.text = String(timeString)

Aktualizuj datę i godzinę co sekundę

override func viewDidLoad() {
super.viewDidLoad()

timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(DateAndTime.action), userInfo: nil, repeats: true)

       }

func action()
    {
    //Date
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .medium
    let dateString = "Current date is: \(dateFormatter.string(from: Date() as Date))"
    labelfordate.text = String(dateString)


    //Time
    let timeFormatter = DateFormatter()
    timeFormatter.timeStyle = .medium
    let timeString = "Current time is: \(timeFormatter.string(from: Date() as Date))"
    labelfortime.text = String(timeString)

    }

Uwaga: DateAndTime w kodzie Timer to nazwa klasy.

Kay Cee
źródło
5

Wiem, że jest wiele odpowiedzi, ale myślę, że moje mogą być dla wielu wygodniejsze

extension String {
    init(epoch: Double) {
        let date = Date(timeIntervalSince1970: epoch)

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "dd/MM/yyyy HH:mm:ssZZZ"

        self = dateFormatter.string(from: date)
    }
}

źródło
4

Możesz tego spróbować

func getTime() -> (hour:Int, min:Int, sec:Int) {
        let currentDateTime = NSDate()
        let calendar = NSCalendar.currentCalendar()
        let components = calendar.components([.Hour,.Minute,.Second], fromDate: currentDateTime)
        let hour = components.hour
        let min = components.minute
        let sec = components.second
        return (hour,min,sec)
    }

Teraz wywołaj tę metodę i otrzymaj datę z godziną, minutą i sekundą

    let currentTime = self.getTime()
    print("Hour: \(currentTime.hour) Min: \(currentTime.min) Sec: \(currentTime.sec))")
nabu
źródło
4

Możesz użyć w szybkim 4 lub 5 jak poniżej

let date = Date()
let df = DateFormatter()
df.dateFormat = "yyyy-MM-dd HH:mm:ss"
let dateString = df.string(from: date)

Ouput będzie jak ryk

2019-12-20 09:40:08
Enamul Haque
źródło
3

Xcode 8.2.1 • Swift 3.0.2

extension Date {
    var hour: Int { return Calendar.autoupdatingCurrent.component(.hour, from: self) }
}

let date = Date()      // "Mar 16, 2017, 3:43 PM"
let hour = date.hour   // 15
Leo Dabus
źródło
a nawet po prostuDate().hour
NoodleOfDeath
1
@NoodleOfDeath na pewno. To zależy, czy potrzebne jest odniesienie do daty, czy nie.
Leo Dabus
Bardzo prawda, i przypuszczam, że do wszystkich intensywnych celów, chciałbyś użyć tej samej zmiennej daty podczas generowania powiązanych składników daty, a nie nowo wygenerowanej dla każdego składnika daty
NoodleOfDeath
3

W oparciu o epicko zwięzłe rozwiązanie noiiv , oto jeszcze bardziej zwięzłe wdrożenie Swift 3/4:

Szybki 3/4

let components = Calendar.current.dateComponents([.hour, .minute], from: Date())
let (hour, minute) = (components.hour, components.minute)

Ponadto, rozszerzając rozszerzenie Leo Dabusa, możemy mieć:

extension Date {

    func components(_ components: Set<Calendar.Component>) -> DateComponents {
        return Calendar.current.dateComponents(components, from: self)
    }

    func component(_ component: Calendar.Component) -> Int {
        return Calendar.current.component(component, from: self)
    }

    var era: Int { return component(.era) }
    var year: Int { return component(.year) }
    var month: Int { return component(.month) }
    var day: Int { return component(.day) }
    var hour: Int { return component(.hour) }
    var minute: Int { return component(.minute) }
    var second: Int { return component(.second) }
    var weekday: Int { return component(.weekday) }
    var weekdayOrdinal: Int { return component(.weekdayOrdinal) }
    var quarter: Int { return component(.quarter) }
    var weekOfMonth: Int { return component(.weekOfMonth) }
    var weekOfYear: Int { return component(.weekOfYear) }
    var yearForWeekOfYear: Int { return component(.yearForWeekOfYear) }
    var nanosecond: Int { return component(.nanosecond) }
    var calendar: Calendar? { return components([.calendar]).calendar }
    var timeZone: TimeZone? { return components([.timeZone]).timeZone }

}

I użyj go w ten sposób:

let date = Date()
let (hour, minute) = (date.hour, date.minute)
NoodleOfDeath
źródło
nie ma potrzeby zwracania opcjonalnego przy pobieraniu czegoś takiego jak rok, miesiąc, dzień itp. z Dateobiektu. Metoda komponentu kalendarza Btw jest bardziej odpowiednia dla pojedynczego komponentu
Leo Dabus
@LeoDabus opcjonalne jest propagowane, ponieważ DateComponents.yearakcesorium toInt?
NoodleOfDeath
1
możesz użyć metody komponentu Kalendarz, która zwraca wartość opcjonalną. Możesz także wymusić rozpakowanie. To nigdy nie zawiedzie. Ale
trzymałbym się
Zaktualizowano @LeoDabus, aby używać tej componentmetody dla tych akcesorów
NoodleOfDeath
2

tylko na datę w określonym formacie

    let dateFormatter1 = NSDateFormatter()
    dateFormatter1.dateStyle = .MediumStyle
    dateFormatter1.timeStyle = .NoStyle
    dateFormatter1.dateFormat = "dd-MM-yyyy"
    let date = dateFormatter1.stringFromDate(NSDate())
Zain Ullah Muhammad
źródło
1
Tylko uwaga, gdy używasz NSDateFormatter, są to drogie obiekty do utworzenia, więc możesz użyć leniwego gettera, aby ponownie użyć tego samego NSDateFormatter, jeśli używasz tego kodu w tabeli lub kolekcji lub coś w tym rodzaju. Style i format można w razie potrzeby zmieniać w trywialny sposób, nie wpływając na wydajność tak bardzo, jak odtwarzając je tam, gdzie są potrzebne. Twoje zdrowie.!
jcpennypincher
2

Szybki 5

func printTimestamp() {
    let timestamp = DateFormatter.localizedString(from: NSDate() as Date, dateStyle: .medium, timeStyle: .short)
    print(timestamp)
}

i funkcja wywołania printTimestamp ()

KRS
źródło
1

Możesz utworzyć rozszerzenie Date, w ten sposób możesz łatwo wywołać je w innych plikach. Oto przykład rozszerzenia daty korzystającego z obliczonej właściwości.

Wydrukuje to: „Dzisiaj, 16:55”

extension Date {

    var formatter: DateFormatter? {
        let formatter = DateFormatter()
        formatter.dateStyle = .short
        formatter.timeStyle = .short
        formatter.doesRelativeDateFormatting = true

        return formatter
    }
}
pcnick13
źródło
1

Możesz użyć Swift4 lub Swift 5 poniżej:

let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let current_date = dateFormatter.string(from: date)
print("current_date-->",current_date)

dane wyjściowe takie jak:

2020-03-02
Enamul Haque
źródło
0

Ponieważ musisz sformatować odpowiedź w określony sposób, możesz łatwo użyć tej metody, domyślnie = "dd-MM-rrrr".

extension Date {

   func today(format : String = "dd-MM-yyyy") -> String{
      let date = Date()
      let formatter = DateFormatter()
      formatter.dateFormat = format
      return formatter.string(from: date)
   }
}

Teraz można uzyskać dzisiejszą datę za pomocą

Date().today() or Date().today("dd/MM/yyyy") 
king_T
źródło
0

SWIFT 4:

extension Date
{
    func hour() -> Int
    {
    //Get Hour
    let calendar = Calendar.current
    let components = calendar.component(.hour, from: self)
    let hour = components

    //Return Hour
    return hour
    }


    func minute() -> Int
    {
    //Get Minute
    let calendar = Calendar.current
    let components = calendar.component(.minute, from: self)
    let minute = components

    //Return Minute
    return minute
        }
}
Vladimir Sukanica
źródło
proszę wyjaśnij swoją odpowiedź.
MrMavavin
rozszerza zintegrowaną datę void ... ustawia zmienną godziny void Date na wartość int, jak również zmienną minut, a następnie zwraca godzinę i minutę jako wartość int. Następnie możesz używać go w kodzie w dowolny sposób. Na przykład, możesz wywołać te wartości z DateComponents () - DateComponents.hour = Date.hour () - daje ci wartość int bieżącego czasu.
Vladimir Sukanica
0
func getCurrentDate() -> Date {
    let date = Date()
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let dateInString  = dateFormatter.string(from: date)
    let dateinDate = dateFormatter.date(from: dateInString)
    return dateinDate!
}
Abuzar Manzoor
źródło
0

Oto rozszerzenie SWIFT, aby uzyskać aktualny czas lokalizacji urządzenia (GMT).

func getGMTTimeDate() -> Date {
   var comp: DateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: self)
   comp.calendar = Calendar.current
   comp.timeZone = TimeZone(abbreviation: "GMT")!
   return Calendar.current.date(from: comp)!
}

Uzyskaj teraz czas: -

Date().getGMTTimeDate()
Chathuranga Silva
źródło
0

Współpracuje z Swift 5 (Xcode 10 i Xcode 11) (z Francji UTC)

func getCurrentDateTime() {
    let now = Date()
    let formatter = DateFormatter()
    formatter.locale = Locale(identifier: "fr_FR")
    formatter.dateFormat = "EEEE dd MMMM YYYY HH:mm"
    myLabel.text = formatter.string(from: now)
    myLabel.font = UIFont(name: "HelveticaNeue-Light", size: 12)
    myLabel.textColor = UIColor.black
}

Jeśli chcesz wyświetlać tylko datę, ustaw formatter.dateFormat

formatter.dateFormat = "EEEE dd MMMM YYYY"

Aby wyświetlić tylko godziny, zmień formatter.dateFormatna

formatter.dateFormat = "HH:mm"

Nie zapomnij dodać getCurrentDateTime()na viewDidLoad.

Benjamin Tourin
źródło
-1

Możesz uzyskać z Dateformatter

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
let dateString = dateFormatter.string(from:Date())
print(dateString)
Ucdemir
źródło