Geçerli saati datetime olarak alma


263

Yeni oyun alanıyla yeni başladım. Basit bir uygulama oluşturmaya çalışıyorum.

Ben böyle bir tarih nesnesi oluşturdum:

var date = NSDate()

Geçerli saati nasıl alabilirim? Diğer dillerde böyle bir şey yapabilirim:

var hour = date.hour

Ama böyle bir özellik / yöntem bulamıyorum. Bir yöntem buldum dateWithCalendarFormat. Bunu kullanmalı mıyım? Öyleyse nasıl?

Yanıtlar:


389

Swift 3 için güncelleme:

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

Bunu yapıyorum:

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

Aynı soruyu objektif-c'de görün. NSDate'den nasıl saat ve dakika alabilirim?

Nate'in cevabı ile karşılaştırıldığında, bu sayı ile birlikte sayıları elde edeceksiniz, iplerle değil… seçiminizi yapın!


Merhaba, cevap için teşekkürler, örneğin dakika iki karakterden azsa "04" gibi iki karakterle nasıl iade edebilirim?
Yestay Muratov

2
@YestayMuratov Bu kullanışlı web sayfası, Swift'te NSDateFormatter kullanarak bir tarihi biçimlendirmenin tüm olası yollarına sahiptir :) codingexplorer.com/…
Max

15
Görünüşe göre yeni Swift sürümü (2) benzer bir şey kullanmanız gerekiyor let components = calendar.components(.NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date), dikey eğik çizgi artık burada kullanılamıyor.
Hola Soy Edu Feliz Navidad

5
let components = calendar.components(NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date)fazladan kaldırıldı '.' önce NSCalendarUnit
cakes88

45
Swift 2.1: let components = calendar.components([ .Hour, .Minute, .Second], fromDate: date)
Obiwahn

184

Swift 4 ile test edildi

Güncel Tarih ve Saati Alma

Geçerli tarih ve saati şu şekilde alabilirsiniz:

let currentDateTime = Date()

Ancak, Date1 Ocak 2001 referans tarihinden 00:00:00 UTC'den bu yana geçen saniye sayısını ölçen 64 bit kayan nokta sayısıdır . Şu tarihte şu sayıyı kullanarak görebilirim:

Date().timeIntervalSinceReferenceDate

Bu yazı yazıldığı zaman 497626515.185066, muhtemelen tam olarak aradığınız şey değil, geri döndü . Okumaya devam et.

Başka Bir Tarih ve Saat Oluşturma

Yöntem 1

Referans tarihinden önceki veya sonraki saniye sayısını biliyorsanız, bunu kullanabilirsiniz.

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

Yöntem 2

Tabii ki, bir yapmak için yıllar, aylar, günler ve saatler (göreli saniye yerine) kullanmak daha kolay olurdu Date. Bunun için DateComponentsbileşenleri belirtmek ve sonra Calendartarihi oluşturmak için kullanabilirsiniz. CalendarVerir Datebağlamı. Aksi takdirde, hangi saat dilimini veya takvimi ifade edeceğini nasıl bilebilir?

// 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)

Diğer saat dilimi kısaltmaları burada bulunabilir . Bunu boş bırakırsanız, varsayılan değer kullanıcının saat dilimini kullanmaktır.

Yöntem 3

En özlü yol (ama mutlaka en iyisi değil) kullanmak olabilir DateFormatter.

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

Unicode teknik standartlar diğer biçimleri göstermek olduğunu DateFormatterdestekler.

Tarih ve Saati Gösterme

Yöntem 1

Yalnızca tarih veya saatin belirli bileşenlerini görüntülemek CalendarUnitistiyorsanız, ayıklamak istediğiniz bileşenleri belirtmek için kullanabilirsiniz 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

Bu yanıta da bakınız .

Yöntem 2

Yöntem 1 size bileşenleri verdi, ancak bu sayıları her stil, dil ve bölge için biçimlendirmek çok iş olurdu. Ve buna gerek yok. Bu DateFormatterders için sizin için zaten yapıldı .

// 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

Daha fazla biçimlendirme seçeneği gösteren yukarıdaki kodun devamı:

// "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)

Bununla birlikte, bunun ABD'ye ayarlanmış bölge ile İngilizce için olduğunu unutmayın. Diğer diller ve bölgeler için biçimlendirme farklı görünecektir.

İlerideki çalışma


58

NSDateFormatter'in kolaylık yöntemini de kullanabilirsiniz;

func printTimestamp() {
  let timestamp = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .MediumStyle, timeStyle: .ShortStyle)
  print(timestamp)
}
printTimestamp() // Prints "Sep 9, 2014, 4:30 AM"

2
NSDateFormatter oluşturmak pahalıdır. Üzerinde oluşturmalı ve tekrar kullanmalısınız.
Rog

3
Swift 3: let timestamp = DateFormatter.localizedString (itibaren: Tarih (), tarihStyle: .short, timeStyle: .short)
Brian

51

Swift, uzantı oluşturmayı ve kullanmayı gerçekten kolaylaştırır. Bir sharedCode.swiftdosya oluşturuyorum ve içine sayılar, uzantılar ve diğer eğlenceli şeyleri koyuyorum. Ben NSDatetekrar tekrar yazmak zahmetli ve çirkin bazı tipik işlevsellik eklemek için bir uzantı oluşturdu :

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
    }
}

Bu uzantıyı kullanarak artık aşağıdaki gibi bir şey yapabilirsiniz:

        //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()))")

Hangi 11:51 AM yazacaktı:

(Geçerli Saat = 11) (Geçerli Dakika = 51) (Mevcut Kısa Zaman Dizesi = 11:51)


26

Swift 2 cevabı:

 let date = NSDate()
 let calendar = NSCalendar.currentCalendar()
 let components = calendar.components([.Hour, .Minute], fromDate: date)
 let hour = components.hour
 let minutes = components.minute

23

Hızlı 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

ÇIKTI

2018-Mayıs-01 10:41:31


1
aralığı asla kullanılmaz.
Nerdy Bunz

11

Hızlı 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)"
}

Not - tarih saati olarak geçerli saati (ve saati) alarak sorunun tam olarak ne anlama geldiğinden emin değilim, ancak umarım yukarıdaki soruya cevap verecek kadar açıklamalıdır.


SaRaVaNaN DM'nin yukarıdaki cevabı Calendar.current'in sonunda fazladan bir '()' işaretine sahipti.
Charlie Seligman

10

Swift 5 ile, Foundationbir Datenesneden saat değerini almanın birçok yolunu sunar . İhtiyaçlarınıza göre, aşağıdaki dört Oyun Alanı kod parçacığından birini seçebilirsiniz .


# 1. Calendar dateComponents(_:from:)Yöntemi kullanarak

Calendaradlı bir yöntem var dateComponents(_:from:). dateComponents(_:from:)aşağıdaki beyanı içerir:

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

Takvim saat dilimini kullanarak bir tarihin tüm tarih bileşenlerini döndürür.

Kullanımı:

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. Calendar component(_:from:)Yöntemi kullanarak

Calendaradlı bir yöntem var component(_:from:). component(_:from:)aşağıdaki beyanı içerir:

Bir tarihin bir bileşeninin değerini döndürür.

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

Kullanımı:

import Foundation

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

3.. DateFormatter dateFormatMülkü kullanma

DateFormatteradlı bir mülke sahip dateFormat. dateFormataşağıdaki beyanı içerir:

var dateFormat: String! { get set }

Alıcı tarafından kullanılan tarih biçimi dizesi.

Kullanımı:

import Foundation

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

4.. Dateformatter setLocalizedDateFormatFromTemplate(_:)Yöntemi kullanarak

Dateformatteradlı bir yöntem var setLocalizedDateFormatFromTemplate(_:). setLocalizedDateFormatFromTemplate(_:)aşağıdaki beyanı içerir:

func setLocalizedDateFormatFromTemplate(_ dateFormatTemplate: String)

Alıcı için belirtilen yerel ayarı kullanarak şablondan tarih biçimini ayarlar.

Kullanımı:

import Foundation

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

7

sadece günün saatine ihtiyacınız varsa

let calendar = NSCalendar.currentCalendar()
var hour = calendar.component(.Hour,fromDate: NSDate())

6

Swift 3'te,

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

    let hour = calendar.component(.hour, from: date)

let calendar = Calendar.current; let unitFlags: Set<Calendar.Component> = Set<Calendar.Component ([.hour]); let components = calendar.dateComponents(unitFlags, from: self)
AbdulMomen عبدالمؤمن

6

Tarih Biçimlendiricisini Kullanma -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)

Tarih ve Saati Her Saniye Güncelle

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)

    }

Not: Zamanlayıcı kodundaki DateAndTime Sınıf adıdır.


5

Bir sürü cevap olduğunu biliyorum ama benimkinin birçok kişi için daha uygun olabileceğini düşünüyorum

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)
    }
}

4

Bunu deneyebilirsin

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)
    }

Şimdi bu yöntemi çağırın ve tarihi saat, dakika ve saniye ile alın

    let currentTime = self.getTime()
    print("Hour: \(currentTime.hour) Min: \(currentTime.min) Sec: \(currentTime.sec))")

4

Körük gibi hızlı 4 veya 5 olarak kullanabilirsiniz

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

Çıkışı feryat gibi olacak

2019-12-20 09:40:08

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

hatta sadeceDate().hour
NoodleOfDeath

1
@NoodleOfDeath emin. Bu, tarihe referans gerekip gerekmediğine bağlıdır.
Leo Dabus

Çok doğru, ve tüm yoğun amaçlar için, her tarih bileşeni için yeni oluşturulan bir bileşen yerine ilgili tarih bileşenleri oluştururken aynı tarih değişkenini kullanmak istediğinizi varsayalım
NoodleOfDeath

3

Noiiv'in epik özlü çözümünü genişleterek , daha da özlü Swift 3/4 uygulaması:

Hızlı 3/4

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

Ayrıca, Leo Dabus'un uzantısını genişleterek şunları elde edebiliriz:

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 }

}

Ve şu şekilde kullanın:

let date = Date()
let (hour, minute) = (date.hour, date.minute)

bir Datenesneden yıl, ay, gün vb. gibi bir şey alırken isteğe bağlı olarak geri dönmeye gerek yoktur . Btw Takvim bileşen yöntemi tek bileşen için daha uygundur
Leo Dabus

@LeoDabus isteğe bağlı propogasyon yapar çünkü DateComponents.yearerişimciInt?
NoodleOfDeath

1
isteğe bağlı olmayan döndüren Takvim bileşeni yöntemini kullanabilirsiniz. Ayrıca açmayı da zorlayabilirsiniz. Asla başarısız olmaz. Ama tek element bileşen yöntemine sadık kalacağım
Leo Dabus

@LeoDabus componentbu erişimciler için yöntemi kullanmak üzere güncellendi
NoodleOfDeath

2

sadece belirli formattaki tarih için

    let dateFormatter1 = NSDateFormatter()
    dateFormatter1.dateStyle = .MediumStyle
    dateFormatter1.timeStyle = .NoStyle
    dateFormatter1.dateFormat = "dd-MM-yyyy"
    let date = dateFormatter1.stringFromDate(NSDate())

1
Sadece bir not, NSDateFormatter kullanırken, bunlar oluşturmak için pahalı nesnelerdir, bu nedenle bu kodu bir tabloda veya koleksiyonda veya bir şeyde kullanıyorsanız aynı NSDateFormatter'ı yeniden kullanmak için tembel bir alıcı kullanmak isteyebilirsiniz. Stiller ve biçim, gerektiğinde performansı yeniden etkilemeden, gerektiğinde bunları yeniden oluşturmadan önemsiz bir şekilde değiştirilebilir. Şerefe.!
jcpennypincher

2

Hızlı 5

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

ve Çağrı işlevi printTimestamp ()


1

Üzerinde bir uzantı oluşturabilirsiniz Date, böylece onu diğer dosyalarda kolayca çağırabilirsiniz. Hesaplanmış bir özelliği kullanan bir tarih uzantısına örnek.

Bunu yazdıracak: "Bugün, 16:55"

extension Date {

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

        return formatter
    }
}

1

Swift4 veya Swift 5'i aşağıdaki gibi kullanabilirsiniz:

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

gibi çıktı:

2020-03-02

0

Cevabı belirli bir şekilde biçimlendirmeniz gerekiyorsa, bu yöntemi kolayca kullanabilirsiniz, default = "dd-AA-yyyy".

extension Date {

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

Bugünün tarihini almak artık

Date().today() or Date().today("dd/MM/yyyy") 

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
        }
}

lütfen cevabınızı açıklayınız.
MrMaavin

Entegre Date void değerini genişletir ... void Date'nin saat değişkenini int değerine, dakika değişkeni olarak koyar, sonra saat ve dakikayı int değeri olarak döndürür. Bundan sonra kodu istediğiniz gibi kullanabilirsiniz. Örneğin, bu değerleri DateComponents () - DateComponents.hour = Date.hour () öğesinden çağırabilirsiniz - size geçerli zamanın int değerini verir.
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!
}

0

Geçerli cihaz konum saatinizi (GMT) almak için SWIFT uzantısı burada .

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)!
}

Şimdi zaman alın: -

Date().getGMTTimeDate()

0

Swift 5 (Xcode 10 ve Xcode 11) ile çalışır (Fransa UTC'den)

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
}

Yalnızca tarihi görüntülemek istiyorsanız, formatter.dateFormat

formatter.dateFormat = "EEEE dd MMMM YYYY"

Sadece birkaç saat, değişikliği görüntülemek için formatter.dateFormatiçin

formatter.dateFormat = "HH:mm"

Eklemeyi unutmayın getCurrentDateTime()üzerinde viewDidLoad.


-1

Dateformatter'dan alabilirsiniz

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
let dateString = dateFormatter.string(from:Date())
print(dateString)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.