【问题标题】:Date Format in SwiftSwift 中的日期格式
【发布时间】:2016-06-12 12:50:41
【问题描述】:

我将如何从日期转换这个日期时间?

从此:2016-02-29 12:24:26
至:2016 年 2 月 29 日

到目前为止,这是我的代码,它返回一个 nil 值:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"
dateFormatter.timeZone = NSTimeZone(name: "UTC")
let date: NSDate? = dateFormatter.dateFromString("2016-02-29 12:24:26")
print(date)

【问题讨论】:

    标签: ios swift nsdate nsdateformatter


    【解决方案1】:

    这可能对想要使用dateformater.dateformat的人有用;

    如果你想要12.09.18,你可以使用dateformater.dateformat = "dd.MM.yy"

    Wednesday, Sep 12, 2018           --> EEEE, MMM d, yyyy
    09/12/2018                        --> MM/dd/yyyy
    09-12-2018 14:11                  --> MM-dd-yyyy HH:mm
    Sep 12, 2:11 PM                   --> MMM d, h:mm a
    September 2018                    --> MMMM yyyy
    Sep 12, 2018                      --> MMM d, yyyy
    Wed, 12 Sep 2018 14:11:54 +0000   --> E, d MMM yyyy HH:mm:ss Z
    2018-09-12T14:11:54+0000          --> yyyy-MM-dd'T'HH:mm:ssZ
    12.09.18                          --> dd.MM.yy
    10:41:02.112                      --> HH:mm:ss.SSS
    

    这里有替代方案:

    • 时代:G (AD), GGGG (Anno Domini)
    • 年份:y(2018),yy(18),yyyy(2018)
    • 月份:M、MM、MMM、MMMM、MMMMM
    • 一个月中的某天:d, dd
    • 星期几名称:E, EEEE, EEEEE, EEEEEE

    【讨论】:

    【解决方案2】:

    您必须声明 2 个不同的 NSDateFormatters,第一个将字符串转换为 NSDate,第二个以您的格式打印日期。
    试试这个代码:

    let dateFormatterGet = NSDateFormatter()
    dateFormatterGet.dateFormat = "yyyy-MM-dd HH:mm:ss"
    
    let dateFormatterPrint = NSDateFormatter()
    dateFormatterPrint.dateFormat = "MMM dd,yyyy"
    
    let date: NSDate? = dateFormatterGet.dateFromString("2016-02-29 12:24:26")
    print(dateFormatterPrint.stringFromDate(date!))
    

    Swift 3 及更高版本:

    从 Swift 3 开始,NSDate 类已更改为 Date,NSDateFormatter 已更改为 DateFormatter。

    let dateFormatterGet = DateFormatter()
    dateFormatterGet.dateFormat = "yyyy-MM-dd HH:mm:ss"
    
    let dateFormatterPrint = DateFormatter()
    dateFormatterPrint.dateFormat = "MMM dd,yyyy"
    
    if let date = dateFormatterGet.date(from: "2016-02-29 12:24:26") {
        print(dateFormatterPrint.string(from: date))
    } else {
       print("There was an error decoding the string")
    }
    

    【讨论】:

    • 如果 dateFormatterGet dateFormat 需要接受 2 种不同的格式——一种包含毫秒,另一种不包含毫秒,会发生什么?即 yyyy-MM-dd'T'HH:mm:ssZZZZZ 和 yyyy-MM-dd'T'HH:mm:ss:SSSZZZZZ
    • 我认为您必须声明两个不同的 DateFormatter 才能获取日期:如果第一个失败(它将返回 nil),请使用第二个。
    • 你能帮我吗,“Tue Mar 12 2019 12:00:00 GMT-0500 (CDT)”的日期格式是什么
    • @Devesh 应该是这样的“EEE MMM d yyyy HH:mm:ss ZZZZ”,查看nsdateformatter.com 这是一个非常实用的网站,支持所有格式
    • @lorenzoliveto 是的,我一直在尝试这种格式,我也在 nsdateformatter.com 上尝试过,但仍然无法为“2019 年 3 月 12 日星期二 12:00:00 GMT- 0500 (CDT)”这种格式。我在 JSON 中得到这种格式。我不确定这是否是有效的字符串,你能帮帮我吗?
    【解决方案3】:

    斯威夫特 - 5.0

    let date = Date()
    let formate = date.getFormattedDate(format: "yyyy-MM-dd HH:mm:ss") // Set output formate
    
    extension Date {
       func getFormattedDate(format: String) -> String {
            let dateformat = DateFormatter()
            dateformat.dateFormat = format
            return dateformat.string(from: self)
        }
    }
    

    斯威夫特 - 4.0

    2018-02-01T19:10:04+00:00 转换 2018 年 2 月 1 日

    extension Date {
        static func getFormattedDate(string: String , formatter:String) -> String{
            let dateFormatterGet = DateFormatter()
            dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
    
            let dateFormatterPrint = DateFormatter()
            dateFormatterPrint.dateFormat = "MMM dd,yyyy"
    
            let date: Date? = dateFormatterGet.date(from: "2018-02-01T19:10:04+00:00")
            print("Date",dateFormatterPrint.string(from: date!)) // Feb 01,2018
            return dateFormatterPrint.string(from: date!);
        }
    }
    

    【讨论】:

      【解决方案4】:

      Swift 3 及更高版本

      let dateFormatter = DateFormatter()
      dateFormatter.dateStyle = .medium
      dateFormatter.timeStyle = .none
      dateFormatter.locale = Locale.current
      print(dateFormatter.string(from: date)) // Jan 2, 2001
      

      当您想要本地化您的应用程序时,这也很有帮助。 Locale(identifier: ) 使用ISO 639-1 Code。 另见Apple Documentation

      【讨论】:

      • 如果您想本地化您的应用,只需使用Locale.current 来使用用户的语言环境。
      【解决方案5】:

      Swift 3 版本,使用新的 Date 对象代替 NSDate:

      let dateFormatterGet = DateFormatter()
      dateFormatterGet.dateFormat = "yyyy-MM-dd HH:mm:ss"
      
      let dateFormatter = DateFormatter()
      dateFormatter.dateFormat = "MMM dd,yyyy"
      
      let date: Date? = dateFormatterGet.date(from: "2017-02-14 17:24:26")
      print(dateFormatter.string(from: date!))
      

      编辑:在mitul-nakum 建议之后

      【讨论】:

      • dateFormatterGet.dateFormat = "yyyy-MM-dd HH:mm:ss" 小时格式需要大写 HH,因为小时是 24 格式
      【解决方案6】:

      斯威夫特 3

      let date : Date = Date()
      let dateFormatter = DateFormatter()
      dateFormatter.dateFormat = "MMM dd, yyyy"
      let todaysDate = dateFormatter.string(from: date)
      

      【讨论】:

        【解决方案7】:

        我用这个格式解决了我的问题yyyy-MM-dd'T'HH:mm:ss.SSS'Z'(例如 2018-06-15T00:00:00.000Z):

        func formatDate(date: String) -> String {
           let dateFormatterGet = DateFormatter()
           dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
        
           let dateFormatter = DateFormatter()
           dateFormatter.dateStyle = .medium
           dateFormatter.timeStyle = .none
           //    dateFormatter.locale = Locale(identifier: "en_US") //uncomment if you don't want to get the system default format.
        
           let dateObj: Date? = dateFormatterGet.date(from: date)
        
           return dateFormatter.string(from: dateObj!)
        }
        

        【讨论】:

          【解决方案8】:

          Convert @BatyrCan answer to Swift 5.3 with extra formats。在 Xcode 12 中测试。

          let dateFormatter = DateFormatter()
          dateFormatter.dateFormat = "HH:mm:ss"
          var dateFromStr = dateFormatter.date(from: "12:16:45")!
          
          dateFormatter.dateFormat = "hh:mm:ss a 'on' MMMM dd, yyyy"
          //Output: 12:16:45 PM on January 01, 2000
          
          dateFormatter.dateFormat = "E, d MMM yyyy HH:mm:ss Z"
          //Output: Sat, 1 Jan 2000 12:16:45 +0600
          
          dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
          //Output: 2000-01-01T12:16:45+0600
          
          dateFormatter.dateFormat = "EEEE, MMM d, yyyy"
          //Output: Saturday, Jan 1, 2000
          
          dateFormatter.dateFormat = "MM-dd-yyyy HH:mm"
          //Output: 01-01-2000 12:16
          
          dateFormatter.dateFormat = "MMM d, h:mm a"
          //Output: Jan 1, 12:16 PM
          
          dateFormatter.dateFormat = "HH:mm:ss.SSS"
          //Output: 12:16:45.000
          
          dateFormatter.dateFormat = "MMM d, yyyy"
          //Output: Jan 1, 2000
          
          dateFormatter.dateFormat = "MM/dd/yyyy"
          //Output: 01/01/2000
          
          dateFormatter.dateFormat = "hh:mm:ss a"
          //Output: 12:16:45 PM
          
          dateFormatter.dateFormat = "MMMM yyyy"
          //Output: January 2000
          
          dateFormatter.dateFormat = "dd.MM.yy"
          //Output: 01.01.00
          
          //Customisable AP/PM symbols
          dateFormatter.amSymbol = "am"
          dateFormatter.pmSymbol = "Pm"
          dateFormatter.dateFormat = "a"
          //Output: Pm
          
          // Usage
          var timeFromDate = dateFormatter.string(from: dateFromStr)
          print(timeFromDate)
          
          

          【讨论】:

            【解决方案9】:

            Swift 4、4.2 和 5

            func getFormattedDate(date: Date, format: String) -> String {
                    let dateformat = DateFormatter()
                    dateformat.dateFormat = format
                    return dateformat.string(from: date)
            }
            
            let formatingDate = getFormattedDate(date: Date(), format: "dd-MMM-yyyy")
                    print(formatingDate)
            

            【讨论】:

            • 这是一个很好的简短解决方案,只需一个 DateFormatter()!需要注意的一点:DateFormatter 还考虑了应用程序区域(在方案中设置)!例如。 2019-05-27 11:03:03 +0000 格式为 yyyy-MM-dd HH:mm:ss 和“德国”,因为该区域变为 2019-05-27 13:03:03。这种差异是由 DST 造成的:夏季德国是 GMT+2,而冬季是 GMT+1。
            • 绝妙的答案!干得好。
            【解决方案10】:

            带有Date 扩展的Swift 3

            extension Date {
                func string(with format: String) -> String {
                    let dateFormatter = DateFormatter()
                    dateFormatter.dateFormat = format
                    return dateFormatter.string(from: self)
                }
            }
            

            那么你可以这样使用它:

            let date = Date()
            date.string(with: "MMM dd, yyyy")
            

            【讨论】:

              【解决方案11】:

              如果要从“1996-12-19T16:39:57-08:00”解析日期,请使用以下格式“yyyy-MM-dd'T'HH:mm:ssZZZZZ”:

              let RFC3339DateFormatter = DateFormatter()
              RFC3339DateFormatter.locale = Locale(identifier: "en_US_POSIX")
              RFC3339DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
              RFC3339DateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
              
              /* 39 minutes and 57 seconds after the 16th hour of December 19th, 1996 with an offset of -08:00 from UTC (Pacific Standard Time) */
              let string = "1996-12-19T16:39:57-08:00"
              let date = RFC3339DateFormatter.date(from: string)
              

              来自苹果https://developer.apple.com/documentation/foundation/dateformatter

              【讨论】:

                【解决方案12】:

                格式化日期的另一种可能性。此截图属于苹果的“新闻”App。

                代码如下:

                let dateFormat1 = DateFormatter()
                dateFormat1.dateFormat = "EEEE"
                let stringDay = dateFormat1.string(from: Date())
                
                let dateFormat2 = DateFormatter()
                dateFormat2.dateFormat = "MMMM"
                let stringMonth = dateFormat2.string(from: Date())
                
                let dateFormat3 = DateFormatter()
                dateFormat3.dateFormat = "dd"
                let numDay = dateFormat3.string(from: Date())
                
                let stringDate = String(format: "%@\n%@ %@", stringDay.uppercased(), stringMonth.uppercased(), numDay)
                

                没有什么可以添加到 lorenzoliveto 提出的替代方案中。简直完美。

                let dateFormat = DateFormatter()
                dateFormat.dateFormat = "EEEE\nMMMM dd"
                let stringDate = dateFormat.string(from: Date()).uppercased()
                

                【讨论】:

                • 这可以仅使用一个格式为“EEEE\nMMMM dd”的日期格式化程序来压缩。
                • 纠正:我已经测试了代码,但您没有获得大写字母。
                • 是的,大写必须应用于返回的字符串,就像你的答案一样。日期格式化程序不返回大写字符串。只需像这样添加 .uppercased() "dateFormat.string(from: Date()).uppercased()"
                【解决方案13】:
                    import UIKit
                    // Example iso date time
                    let isoDateArray = [
                        "2020-03-18T07:32:39.88Z",
                        "2020-03-18T07:32:39Z",
                        "2020-03-18T07:32:39.8Z",
                        "2020-03-18T07:32:39.88Z",
                        "2020-03-18T07:32:39.8834Z"
                    ]
                
                
                    let dateFormatterGetWithMs = DateFormatter()
                    let dateFormatterGetNoMs = DateFormatter()
                
                // Formater with and without millisecond 
                    dateFormatterGetWithMs.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
                    dateFormatterGetNoMs.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
                
                    let dateFormatterPrint = DateFormatter()
                    dateFormatterPrint.dateFormat = "MMM dd,yyyy"
                
                    for dateString in isoDateArray {
                        var date: Date? = dateFormatterGetWithMs.date(from: dateString)
                        if (date == nil){
                            date = dateFormatterGetNoMs.date(from: dateString)
                        }
                        print("===========>",date!)
                    }
                

                【讨论】:

                • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
                【解决方案14】:

                只需使用以下函数转换日期格式:-

                  let convertedFormat =  convertToString(dateString: "2019-02-12 11:23:12", formatIn: "yyyy-MM-dd hh:mm:ss", formatOut: "MMM dd, yyyy")    //calling function
                
                   print(convertedFormat) // feb 12 2019
                
                
                 func convertToString (dateString: String, formatIn : String, formatOut : String) -> String {
                
                    let dateFormater = DateFormatter()
                    dateFormater.timeZone = NSTimeZone(abbreviation: "UTC") as TimeZone!
                    dateFormater.dateFormat = formatIn
                    let date = dateFormater.date(from: dateString)
                
                    dateFormater.timeZone = NSTimeZone.system
                
                    dateFormater.dateFormat = formatOut
                    let timeStr = dateFormater.string(from: date!)
                    return timeStr
                 }
                

                【讨论】:

                  【解决方案15】:

                  iOS 15.0+

                  iPadOS 15.0+, macOS 12.0+, Mac 催化剂 15.0+, tvOS 15.0+, watchOS 8.0+, Xcode 13.0+

                  使用formatted(date:time:)

                  let now = Date.now
                  let date = now.formatted(date: .abbreviated, time: .omitted)
                  

                  您可以使用另一个DateStyle(例如.long、.numeric)来代替.abbreviated,或者定义自定义格式。

                  https://developer.apple.com

                  【讨论】:

                  • @FontFamily 在某种程度上你是对的。我更新了 URL,但仍然没有可用的概述。
                  • 文档说这在 iOS 15 中可用,与 Swift 版本无关。
                  【解决方案16】:

                  要将 2016-02-29 12:24:26 转换为日期,请使用此日期格式化程序:

                  let dateFormatter = NSDateFormatter()
                  dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"
                  

                  编辑:要获得 2016 年 2 月 29 日的输出,请使用此日期格式化程序:

                  let dateFormatter = NSDateFormatter()
                  dateFormatter.dateFormat = "MMM dd, yyyy"
                  

                  【讨论】:

                  • 但是如何将其转换为这种日期格式 2016 年 2 月 29 日
                  • 你知道为什么我尝试打印这个时得到 nil 吗?
                  【解决方案17】:

                  对于 Swift 4.2、5

                  以任何你想要的方式传递日期和格式。 选择格式可以访问NSDATEFORMATTER website:

                  static func dateFormatter(date: Date,dateFormat:String) -> String {
                      let dateFormatter = DateFormatter()
                      dateFormatter.dateFormat = dateFormat
                      return dateFormatter.string(from: date)
                  }
                  

                  【讨论】:

                    【解决方案18】:

                    将它放在扩展中并像下面这样调用它。它易于在整个应用程序中使用。

                    self.getFormattedDate(strDate: "20-March-2019", currentFomat: "dd-MMM-yyyy", expectedFromat: "yyyy-MM-dd")
                    

                    实施

                    func getFormattedDate(strDate: String , currentFomat:String, expectedFromat: String) -> String{
                        let dateFormatterGet = DateFormatter()
                        dateFormatterGet.dateFormat = currentFomat
                    
                        let date : Date = dateFormatterGet.date(from: strDate) ?? Date()
                    
                        dateFormatterGet.dateFormat = expectedFromat
                        return dateFormatterGet.string(from: date)
                    }
                    

                    【讨论】:

                      【解决方案19】:

                      从 iOS 15 开始使用这样的东西:

                      extension Date {
                          var string: String {
                              if #available(iOS 15.0, *) {
                                  return self.formatted(date: .complete, time: .complete)
                              } else {
                                  return self.description
                              }
                          }
                      }
                      

                      【讨论】:

                        【解决方案20】:

                        斯威夫特 3

                        func dataFormat(dataJ: Double) -> String {
                        
                                let dateFormatter = DateFormatter()
                                dateFormatter.dateStyle = .long
                                dateFormatter.timeStyle = .none
                                let date = Date(timeIntervalSince1970: dataJ)
                                return (dataJ != nil) ? "Today, \(dateFormatter.string(from: date))" : "Date Invalid"
                        
                            }
                        

                        【讨论】:

                          【解决方案21】:

                          我建议默认添加时区。我将展示一个 swift 5 的示例
                          1.新建一个扩展文件Date+Formatter.swift

                          import Foundation
                          
                          extension Date {
                              func getFormattedDateString(format: String) -> String {
                                  let dateFormatter = DateFormatter()
                                  dateFormatter.dateFormat = format
                                  dateFormatter.timeZone = TimeZone.current
                                  return dateFormatter.string(from: self)
                              }
                          }
                          
                          1. 使用示例
                              let date = Date()
                              let dateString = date.getFormattedDateString(format: "yyyy-MM-dd HH:mm:ss")
                              print("dateString > \(dateString)")
                              // print
                              // dateString > 2020-04-30 15:15:21
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2018-10-03
                            • 1970-01-01
                            相关资源
                            最近更新 更多