【问题标题】:How can I convert string date to NSDate?如何将字符串日期转换为 NSDate?
【发布时间】:2014-09-06 18:53:57
【问题描述】:

我想在 Swift 中将“2014-07-15 06:55:14.198000+00:00”这个字符串日期转换为 NSDate。

【问题讨论】:

标签: ios string swift nsdate


【解决方案1】:

试试这个:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = /* find out and place date format from 
                            * http://userguide.icu-project.org/formatparse/datetime
                            */
let date = dateFormatter.dateFromString(/* your_date_string */)

如需进一步查询,请分别查看 Objective-C 和 Swift 的 Foundation 框架的 NSDateFormatterDateFormatter 类。

Swift 3 及更高版本(包括 Swift 4)

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = /* date_format_you_want_in_string from
                            * http://userguide.icu-project.org/formatparse/datetime
                            */
guard let date = dateFormatter.date(from: /* your_date_string */) else {
   fatalError("ERROR: Date conversion failed due to mismatched format.")
}

// use date constant here

【讨论】:

  • 找到解决方法只需要设置“yyyy-MM-dd hh:mm:ss.SSSSxxx”这个日期格式
  • 我有一个类似“2014-07-15 06:55:14-0400”的日期字符串,我尝试使用yyyy-MM-dd hh:mm:ssZZZ。但我无法从字符串中取出日期对象。
  • @Prem,如果您看到输出是 "2014-07-15 10:55:14 +0000",那将是正确的。从NSDate 描述开始,日期的输出将计算差异(此处为格林威治标准时间-4 小时)。如果您想了解 GMT 和 UTC 之间的差异,即-0400,请查看此reference
  • @x4h1d,嘿,我明白了!我在hh 中犯了一个错误,应该是HH。谢谢!
  • @lmiguelvargasf,我想应该是yyyy-MM-dd'T'HH:mm:ss.SSS'Z'。我假设Z 在这里只是一个角色。请记住,Z 也有特殊含义。如果您希望Z 指定为basic hms,则格式为yyyy-MM-dd'T'HH:mm:ss.SSSZ
【解决方案2】:

斯威夫特 4

import Foundation

let dateString = "2014-07-15" // change to your date format

var dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"

let date = dateFormatter.date(from: dateString)
println(date)

斯威夫特 3

import Foundation

var dateString = "2014-07-15" // change to your date format

var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"

var date = dateFormatter.dateFromString(dateString)
println(date)

我可以用这段代码做到这一点。

【讨论】:

  • 代码不对。它输出一些“Jan 15, 2014, 12:00 AM”
  • 使用 dd 而不是 DD 应该有助于解决“总是一月”的问题。
  • 正确的版本是yyyy-MM-dd,否则解析的日期会卡在1月份——我更新了答案以反映变化。
  • 如果我想将当前日期作为字符串传递怎么办。这行得通吗?
  • @Zorayr,Kittisak :我正在输出,可选(2014-07-14 18:30:00 +0000)这意味着,一天会减少。我该如何解决这个问题?
【解决方案3】:
 func convertDateFormatter(date: String) -> String
 {

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"//this your string date format
    dateFormatter.timeZone = NSTimeZone(name: "UTC")
    let date = dateFormatter.dateFromString(date)


    dateFormatter.dateFormat = "yyyy MMM EEEE HH:mm"///this is what you want to convert format
    dateFormatter.timeZone = NSTimeZone(name: "UTC")
    let timeStamp = dateFormatter.stringFromDate(date!)


    return timeStamp
}

为 Swift 3 更新。

func convertDateFormatter(date: String) -> String
{

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"//this your string date format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    let date = dateFormatter.date(from: date)


    dateFormatter.dateFormat = "yyyy MMM EEEE HH:mm"///this is what you want to convert format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    let timeStamp = dateFormatter.string(from: date!)


    return timeStamp
}

【讨论】:

    【解决方案4】:

    详情

    • Swift 4,Xcode 9.2
    • Swift 5、Xcode 10.2 (10E125)

    解决方案

    import Foundation
    
    extension DateFormatter {
    
        convenience init (format: String) {
            self.init()
            dateFormat = format
            locale = Locale.current
        }
    }
    
    extension String {
    
        func toDate (dateFormatter: DateFormatter) -> Date? {
            return dateFormatter.date(from: self)
        }
    
        func toDateString (dateFormatter: DateFormatter, outputFormat: String) -> String? {
            guard let date = toDate(dateFormatter: dateFormatter) else { return nil }
            return DateFormatter(format: outputFormat).string(from: date)
        }
    }
    
    extension Date {
    
        func toString (dateFormatter: DateFormatter) -> String? {
            return dateFormatter.string(from: self)
        }
    }
    

    用法

    var dateString = "14.01.2017T14:54:00"
    let dateFormatter = DateFormatter(format: "dd.MM.yyyy'T'HH:mm:ss")
    let date = Date()
    
    print("original String with date:               \(dateString)")
    print("date String() to Date():                 \(dateString.toDate(dateFormatter: dateFormatter)!)")
    print("date String() to formated date String(): \(dateString.toDateString(dateFormatter: dateFormatter, outputFormat: "dd MMMM")!)")
    let dateFormatter2 = DateFormatter(format: "dd MMM HH:mm")
    print("format Date():                           \(date.toString(dateFormatter: dateFormatter2)!)")
    

    结果

    更多信息

    About date format

    【讨论】:

      【解决方案5】:

      如果您需要经常将字符串解析为日期,您可能希望将该功能移至扩展程序中。我创建了一个 sharedCode.swift 文件并将我的扩展放在那里:

      extension String
      {   
          func toDateTime() -> NSDate
          {
              //Create Date Formatter
              let dateFormatter = NSDateFormatter()
      
              //Specify Format of String to Parse
              dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss.SSSSxxx"
      
              //Parse into NSDate
              let dateFromString : NSDate = dateFormatter.dateFromString(self)!
      
              //Return Parsed Date
              return dateFromString
          }
      }
      

      然后,如果您想将字符串转换为 NSDate,您可以编写如下内容:

      var myDate = myDateString.toDateTime()
      

      【讨论】:

      • 谢谢。也可以这样写,虽然用处不大
      • 我很确定在这种情况下hh 应该是HH
      • 这没有给我我指定的格式:var date = NSDate();让 dateFormatter = NSDateFormatter(); dateFormatter.dateFormat = "MMMM d, YYYY";让 myDate = dateFormatter.stringFromDate(date);最重要的是,如果我像这样使用您的扩展名-> var myDate2 = myDate.toDateTime();它给了我一个完全不同的日期,而不是当前日期。
      【解决方案6】:

      对于 Swift 3

      func stringToDate(_ str: String)->Date{
          let formatter = DateFormatter()
          formatter.dateFormat="yyyy-MM-dd hh:mm:ss Z"
          return formatter.date(from: str)!
      }
      func dateToString(_ str: Date)->String{
          var dateFormatter = DateFormatter()
          dateFormatter.timeStyle=DateFormatter.Style.short
          return dateFormatter.string(from: str)
      }
      

      【讨论】:

        【解决方案7】:

        此 QA 页面上的代码片段是“颠倒的”...

        Apple 提到的第一件事是缓存格式化程序...

        Link to Apple doco stating exactly how to do this:

        提高效率的缓存格式化程序 创建日期格式化程序并不是一项廉价的操作。 ...缓存单个实例...

        使用全局...

        let df : DateFormatter = {
            let formatter = DateFormatter()
            formatter.dateFormat = "yyyy-MM-dd"
            return formatter 
        }()
        

        然后只需在任何地方使用该格式化程序...

        let s = df.string(from: someDate)
        

        let d = df.date(from: someString)
        

        或者在 DateFormatter 上使用其他许多方便的方法。

        就是这么简单。

        (如果你在 String 上编写扩展,你的代码完全是“颠倒的”——你不能使用任何 dateFormatter 调用!)

        请注意,通常您会有一些全局变量 .. 例如 "formatForClient" "formatForPubNub" "formatForDisplayOnInvoiceScreen" .. 等等。

        【讨论】:

        【解决方案8】:

        Swift 支持扩展,通过扩展,您可以向现有的 classstructureenumerationprotocol 类型添加新功能。

        您可以通过使用extension 关键字扩展对象来将新的init 函数添加到NSDate 对象。

        extension NSDate
        {
            convenience
            init(dateString:String) {
                let dateStringFormatter = NSDateFormatter()
                dateStringFormatter.dateFormat = "yyyyMMdd"
                dateStringFormatter.locale = NSLocale(localeIdentifier: "fr_CH_POSIX")
                let d = dateStringFormatter.dateFromString(dateString)!
                self.init(timeInterval:0, sinceDate:d)
            }
        } 
        

        现在您可以使用以下方法初始化 NSDate 对象:

        let myDateObject = NSDate(dateString:"2010-12-15 06:00:00")
        

        【讨论】:

        • 我喜欢初始化方式。难道没有另一种不使用 timeInterval 来创建日期的方法吗?如果 nsdate 停止使用带有日期参数的初始化程序怎么办?你会怎么解决?我个人更喜欢 init 方式,但我不知道如何克服这个问题
        • 我有一个问题:我作为字符串的日期是这样的:“2017-03-10 22:16:00 +0000”,我使用了这种格式:“yyyy-MM-dd hh:mm :ss Z" 和这个:"yyyy-MM-dd'T'HH:mm:ss"。但是对于两者,当我这样做时:让 beginDate = df.date(from: beginDateString),我得到一个零!为什么? (df = DateFormatter())
        【解决方案9】:

        自 Swift 3 以来,许多 NS 前缀已被删除。

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 
        /* date format string rules
         * http://userguide.icu-project.org/formatparse/datetime
         */
        
        let date = dateFormatter.date(from: dateString)
        

        【讨论】:

        • 我有一个问题:我作为字符串的日期是这样的:“2017-03-10 22:16:00 +0000”,我使用了这种格式:“yyyy-MM-dd hh:mm :ss Z" 和这个:"yyyy-MM-dd'T'HH:mm:ss"。但是对于两者,当我这样做时:让 beginDate = df.date(from: beginDateString),我得到一个零!为什么? (df = DateFormatter())
        【解决方案10】:

        斯威夫特 3,4:

        2 个有用的转化:

        string(from: Date) // to convert from Date to a String
        date(from: String) // to convert from String to Date
        

        用法: 1.

        let date = Date() //gives today's date
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "dd.MM.yyyy"
        let todaysDateInUKFormat = dateFormatter.string(from: date)
        

        2.

         let someDateInString = "23.06.2017"
         var getDateFromString = dateFormatter.date(from: someDateInString)
        

        【讨论】:

          【解决方案11】:

          适用于 SWIFT 3.1

          func convertDateStringToDate(longDate: String) -> String{
          
              /* INPUT: longDate = "2017-01-27T05:00:00.000Z"
               * OUTPUT: "1/26/17"
               * date_format_you_want_in_string from
               * http://userguide.icu-project.org/formatparse/datetime
               */
          
              let dateFormatter = DateFormatter()
              dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
              let date = dateFormatter.date(from: longDate)
          
              if date != nil {
          
                  let formatter = DateFormatter()
                  formatter.dateStyle = .short
                  let dateShort = formatter.string(from: date!)
          
                  return dateShort
          
              } else {
          
                  return longDate
          
              }
          }
          

          注意:如果错误,这将返回原始字符串

          【讨论】:

            【解决方案12】:

            要在 Swift 中的日期格式中添加字符串,我这样做了

             var dataFormatter:NSDateFormatter = NSDateFormatter()
                            dataFormatter.dateFormat = "dd-MMMM 'at' HH:mm a"
            
            cell.timeStamplbl.text = dataFormatter.stringFromDate(object.createdAt)
            

            【讨论】:

              【解决方案13】:

              这对我有用..

                  import Foundation
                  import UIKit
              
                  //dateString = "01/07/2017"
                  private func parseDate(_ dateStr: String) -> String {
                          let simpleDateFormat = DateFormatter()
                          simpleDateFormat.dateFormat = "dd/MM/yyyy" //format our date String
                          let dateFormat = DateFormatter()
                          dateFormat.dateFormat = "dd 'de' MMMM 'de' yyyy" //format return
              
                          let date = simpleDateFormat.date(from: dateStr)
                          return dateFormat.string(from: date!)
                  }
              

              【讨论】:

                【解决方案14】:

                你可以试试这个快速代码

                    let dateFormatter = DateFormatter()
                    dateFormatter.dateFormat = "dd/MM/yyyy"//same as strDate date formator
                    dateFormatter.timeZone = TimeZone(abbreviation: "GMT+0:00")//Must used if you get one day less in conversion
                    let convertedDateObject = dateFormatter.date(from: strDate)
                

                【讨论】:

                • TimeZone(abbreviation: "GMT+0:00") ,你拯救了我的一天
                【解决方案15】:

                下面是一些可以在 swift iOS 中使用的字符串到日期格式转换选项。

                1. Thursday, Dec 27, 2018 格式= EEEE, MMM d, yyyy
                2. 12/27/2018 格式= MM/dd/yyyy
                3. 12-27-2018 09:59 格式= MM-dd-yyyy HH:mm
                4. Dec 27, 9:59 AM 格式= MMM d, h:mm a
                5. December 2018 格式= MMMM yyyy
                6. Dec 27, 2018 格式= MMM d, yyyy
                7. Thu, 27 Dec 2018 09:59:19 +0000 格式= E, d MMM yyyy HH:mm:ss Z
                8. 2018-12-27T09:59:19+0000 格式= yyyy-MM-dd'T'HH:mm:ssZ
                9. 27.12.18 格式= dd.MM.yy
                10. 09:59:19.815 格式= HH:mm:ss.SSS

                【讨论】:

                  【解决方案16】:
                  Swift: iOS
                  if we have string, convert it to NSDate,
                  
                  var dataString = profileValue["dob"] as String
                  var dateFormatter = NSDateFormatter()
                  dateFormatter.dateFormat = "MM-dd-yyyy"
                  
                  // convert string into date
                  let dateValue:NSDate? = dateFormatter.dateFromString(dataString)
                  
                  if you have and date picker parse date like this
                  
                  // to avoid any nil value
                  if let isDate = dateValue {
                  self.datePicker.date = isDate
                  }
                  

                  【讨论】:

                    【解决方案17】:

                    SWIFT 5Xcode 11.0

                    以您想要的“dateString”和“dateFormat”传递格式传递您的(字符串中的日期)。要选择格式,请使用NDateFormatter website

                    func getDateFrom(dateString: String, dateFormat: String) -> Date? {
                        let dateFormatter = DateFormatter()
                        dateFormatter.dateFormat = dateFormat
                        dateFormatter.locale = Locale(identifier: "en_US")
                        guard let date = dateFormatter.date(from: dateString) else {return nil}
                        return date
                    }
                    

                    【讨论】:

                      【解决方案18】:
                      import Foundation
                      
                      let now : String = "2014-07-16 03:03:34 PDT"
                      var date : NSDate
                      var dateFormatter : NSDateFormatter
                      
                      date = dateFormatter.dateFromString(now)
                      
                      date // $R6: __NSDate = 2014-07-16 03:03:34 PDT
                      

                      https://developer.apple.com/library/prerelease/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/index.html#//apple_ref/doc/uid/20000447-SW32

                      【讨论】:

                      • 这应该如何工作?日期格式化程序未初始化,也没有理由拆分日期的声明和初始化。
                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-05-17
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多