【问题标题】:How to get the current time as datetime如何获取当前时间作为日期时间
【发布时间】:2014-07-27 01:15:03
【问题描述】:

刚从操场开始。我正在尝试创建一个简单的应用程序。

我已经创建了一个这样的日期对象:

var date = NSDate()

如何获取当前时间?在其他语言中,我可以这样做:

var hour = date.hour

但我找不到任何类似的属性/方法。我找到了一个方法,dateWithCalendarFormat。我应该用那个吗?如果有,怎么做?

【问题讨论】:

    标签: datetime swift


    【解决方案1】:

    Swift 3 更新:

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

    我这样做:

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

    在objective-c How do I get hour and minutes from NSDate?看到同样的问题

    与 Nate 的答案相比,你会得到这个数字,而不是字符串……选择你的选择!

    【讨论】:

    • 您好,感谢您的回答,例如,如果分钟小于两个字符,我如何用“04”之类的两个字符返回它
    • @YestayMuratov 这个方便的网页讲述了在 Swift 中使用 NSDateFormatter 格式化日期的所有可能方法 :) codingexplorer.com/…
    • 看来新的Swift版本(2)你得用类似于let components = calendar.components(.NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date)的东西,这里不能再用竖斜线了。
    • let components = calendar.components(NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date) 删除了多余的 '.'在 NSCalendarUnit 之前
    • 斯威夫特 2.1:let components = calendar.components([ .Hour, .Minute, .Second], fromDate: date)
    【解决方案2】:

    用 Swift 4 测试

    获取当前日期和时间

    您可以像这样简单地获取当前日期和时间:

    let currentDateTime = Date()
    

    但是,Date 是一个 64 位浮点数,测量自 2001 年 1 月 1 日参考日期 00:00:00 UTC 以来的秒数。我可以通过使用查看当前日期时间的数字

    Date().timeIntervalSinceReferenceDate
    

    在撰写本文时,它返回了 497626515.185066,可能不是您要查找的内容。继续阅读。

    创建另一个日期和时间

    方法一

    如果您知道参考日期之前或之后的秒数,则可以使用它。

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

    方法二

    当然,使用诸如年、月、日和小时(而不是相对秒数)之类的东西来创建Date 会更容易。为此,您可以使用DateComponents 指定组件,然后使用Calendar 创建日期。 Calendar 给出了 Date 上下文。否则,它怎么知道用什么时区或日历来表达呢?

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

    其他时区缩写可以在here找到。如果您将其留空,则默认使用用户的时区。

    方法3

    最简洁的方式(但不一定是最好的)可能是使用DateFormatter

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

    DateFormatter 支持的Unicode technical standards show other formats

    显示日期和时间

    方法一

    如果您只想显示日期或时间的某些部分,您可以使用CalendarUnit 指定要从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
    

    另见this answer

    方法二

    方法 1 为您提供了组件,但是为每种风格、语言和地区格式化这些数字需要大量工作。你不需要。这已经通过 DateFormatter 类为您完成了。

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

    这是上面代码的延续,显示了更多的格式化选项:

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

    但请记住,这是针对英语的,地区设置为美国。对于其他语言和地区,格式看起来会有所不同。

    进一步研究

    【讨论】:

      【解决方案3】:

      你也可以使用 NSDateFormatter 的便捷方法,例如,

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

      【讨论】:

      • 创建 NSDateFormatter 的成本很高。您应该创建并重用它。
      • Swift 3:让 timestamp = DateFormatter.localizedString(from: Date(), dateStyle: .short, timeStyle: .short)
      • 以字符串形式获取当前日期时间的更快方法是:Date().dateString("YYYY.MM.dd HH:mm:ss")
      【解决方案4】:

      Swift 让创建和使用扩展变得非常容易。我创建了一个sharedCode.swift 文件并将枚举、扩展和其他有趣的东西放入其中。我创建了一个NSDate 扩展来添加一些典型的功能,这些功能很难一遍又一遍地输入:

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

      使用此扩展程序,您现在可以执行以下操作:

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

      上午 11:51 会写出:

      (当前小时 = 11)(当前分钟 = 51)(当前短时间字符串 = 11:51 AM)

      【讨论】:

        【解决方案5】:

        斯威夫特 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
        

        输出

        2018-5-01 10:41:31

        【讨论】:

        • 从不使用间隔。
        【解决方案6】:

        斯威夫特 2 答案:

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

        【讨论】:

          【解决方案7】:

          您可以像下面这样在 swift 4 或 5 中使用

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

          输出如下所示

          2019-12-20 09:40:08
          

          【讨论】:

            【解决方案8】:

            在 Swift 5 中,Foundation 提供了许多从 Date 对象获取小时值的方法。根据您的需要,您可以选择以下四个 Playground 代码 sn-ps之一。


            #1。使用CalendardateComponents(_:from:)方法

            Calendar 有一个名为dateComponents(_:from:) 的方法。 dateComponents(_:from:) 有以下声明:

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

            使用日历时区返回一个日期的所有日期部分。

            用法:

            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。使用Calendarcomponent(_:from:)方法

            Calendar 有一个名为component(_:from:) 的方法。 component(_:from:) 有以下声明:

            返回日期的一个组成部分的值。

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

            用法:

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

            #3。使用DateFormatterdateFormat属性

            DateFormatter 有一个名为dateFormat 的属性。 dateFormat 有以下声明:

            var dateFormat: String! { get set }
            

            接收方使用的日期格式字符串。

            用法:

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

            #4。使用DateformattersetLocalizedDateFormatFromTemplate(_:)方法

            Dateformatter 有一个名为setLocalizedDateFormatFromTemplate(_:) 的方法。 setLocalizedDateFormatFromTemplate(_:) 有以下声明:

            func setLocalizedDateFormatFromTemplate(_ dateFormatTemplate: String)
            

            使用为接收者指定的语言环境从模板中设置日期格式。

            用法:

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

            【讨论】:

              【解决方案9】:

              斯威夫特 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 - 通过将当前时间(和小时)作为日期时间不确定问题的确切含义,但希望上述内容足以解释问题。

              【讨论】:

              • SaRaVaNaN DM 的上述回答在 Calendar.current 的末尾有一个额外的“()”。
              【解决方案10】:

              如果你只需要一天中的时间

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

              【讨论】:

                【解决方案11】:

                使用日期格式化程序 -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)
                

                每秒更新日期和时间

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

                注意:Timer代码中的DateAndTime是类名。

                【讨论】:

                  【解决方案12】:

                  在 Swift 3 中,

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

                  【讨论】:

                  • let calendar = Calendar.current; let unitFlags: Set&lt;Calendar.Component&gt; = Set&lt;Calendar.Component ([.hour]); let components = calendar.dateComponents(unitFlags, from: self)
                  【解决方案13】:

                  我知道有很多答案,但我认为我的答案可能对许多人来说更方便

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

                  【讨论】:

                    【解决方案14】:

                    你可以试试这个

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

                    现在调用该方法并接收带有小时、分钟和秒的日期

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

                    【讨论】:

                      【解决方案15】:

                      一行Swift 5.2

                      let date = String(DateFormatter.localizedString(from: Date(), dateStyle: .medium, timeStyle: .short))
                      

                      【讨论】:

                        【解决方案16】:

                        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
                        

                        【讨论】:

                        • 甚至只是Date().hour
                        • @NoodleOfDeath 确定。这取决于是否需要引用日期。
                        • 非常正确,我想出于所有密集目的,您会希望在生成相关日期组件时使用相同的日期变量,而不是为每个日期组件新生成一个
                        【解决方案17】:

                        扩展 noiiv's epically concise solution,这里是更简洁的 Swift 3/4 实现:

                        斯威夫特 3/4

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

                        此外,扩展 Leo Dabus's extension 我们可以:

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

                        然后像这样使用它:

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

                        【讨论】:

                        • Date 对象获取年、月、日等信息时无需返回可选项。顺便说一句,日历组件方法更适合单个组件
                        • @LeoDabus 是可选的,因为 DateComponents.year 访问器是 Int?
                        • 您可以使用返回非可选的日历组件方法。您也可以强制展开。它永远不会失败。但我会坚持使用单元素组件方法
                        • @LeoDabus 更新为对这些访问者使用 component 方法
                        【解决方案18】:

                        仅适用于特定格式的日期

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

                        【讨论】:

                        • 请注意,使用 NSDateFormatter 时,这些对象的创建成本很高,因此如果您在表或集合中使用此代码或某物。样式和格式可以在需要的地方进行细微的更改,而不会影响性能,就像在需要的地方重新创建它们一样。干杯!
                        【解决方案19】:

                        斯威夫特 5

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

                        并调用函数 printTimestamp()

                        【讨论】:

                          【解决方案20】:

                          你可以像下面这样使用 Swift4 或 Swift 5:

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

                          输出如下:

                          2020-03-02
                          

                          【讨论】:

                            【解决方案21】:

                            您可以在Date 上创建一个扩展名,这样您就可以在其他文件中轻松调用它。下面是一个使用计算属性的日期扩展示例。

                            它将打印出来:“今天,下午 4:55”

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

                            【讨论】:

                              【解决方案22】:

                              如果您需要以特定方式格式化答案,您可以轻松使用此方法,默认 = "dd-MM-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)
                                 }
                              }
                              

                              现在可以使用

                              来获取今天的日期
                              Date().today() or Date().today("dd/MM/yyyy") 
                              

                              【讨论】:

                                【解决方案23】:

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

                                【讨论】:

                                • 请解释你的答案。
                                • 它扩展了集成的 Date void...它将 void Date 的小时变量作为 int 值,也是分钟变量,然后将小时和分钟作为 int 值返回。之后,您可以以任何您想要的方式在代码中使用它。例如,您可以从 DateComponents() 调用该值 - DateComponents.hour = Date.hour() - 它为您提供当前时间的 int 值。
                                【解决方案24】:
                                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!
                                }
                                

                                【讨论】:

                                  【解决方案25】:

                                  这是获取您当前设备位置时间 (GMT) 的 SWIFT 扩展程序。

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

                                  现在获取时间:-

                                  Date().getGMTTimeDate()
                                  

                                  【讨论】:

                                    【解决方案26】:

                                    适用于 Swift 5(Xcode 10 和 Xcode 11)(来自法国 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
                                    }
                                    

                                    如果你只想显示日期,设置formatter.dateFormat

                                    formatter.dateFormat = "EEEE dd MMMM YYYY"
                                    

                                    要仅显示小时,请将formatter.dateFormat 更改为

                                    formatter.dateFormat = "HH:mm"
                                    

                                    不要忘记在viewDidLoad 上添加getCurrentDateTime()

                                    【讨论】:

                                      【解决方案27】:

                                      你可以从 Dateformatter 获取

                                      let dateFormatter = DateFormatter()
                                      dateFormatter.dateFormat = "dd/MM/yyyy"
                                      let dateString = dateFormatter.string(from:Date())
                                      print(dateString)
                                      

                                      【讨论】:

                                        【解决方案28】:

                                        以下代码是最新的swift版本(5):

                                        func getTimestamp()-> String {
                                             let timestamp = DateFormatter.localizedString(from: Date(), dateStyle: .medium, timeStyle: .short)
                                             return "\(timestamp)"
                                        }
                                        

                                        【讨论】:

                                        猜你喜欢
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2011-01-01
                                        • 2013-03-10
                                        • 2012-06-14
                                        • 2012-12-04
                                        • 2017-11-28
                                        • 1970-01-01
                                        相关资源
                                        最近更新 更多