如何将字符串日期转换为NSDate?

Sha*_*dul 194 string nsdate ios swift

我想将"2014-07-15 06:55:14.198000 + 00:00"这个字符串日期转换为Swift中的NSDate.

x4h*_*h1d 338

试试这个:

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 */)
Run Code Online (Sandbox Code Playgroud)

要进一步查询,请分别检查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
Run Code Online (Sandbox Code Playgroud)

  • 找到解决方案只需要设置"yyyy-MM-dd hh:mm:ss.SSSSxxx"这个日期格式 (11认同)
  • @ lmiguelvargasf,我想那将是'yyyy-MM-dd'T'HH:mm:ss.SSS'Z'`.我认为`Z`只是这里的一个角色.记住,'Z`也有特殊含义.如果你想要`Z`指定为'基本hms`,那么格式将是`yyyy-MM-dd'T'HH:mm:ss.SSSZ`. (3认同)
  • @Prem,如果您看到输出是“ 2014-07-15 10:55:14 +0000”,那将是正确的。从“ NSDate”描述开始,日期的输出将以差异(此处为GMT -4小时)计算。如果要获取格林尼治标准时间和UTC之间的差异,即“ -0400”,请检查此[参考](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimeZone_Class/ ) (2认同)

Kia*_*rom 71

斯威夫特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)
Run Code Online (Sandbox Code Playgroud)

斯威夫特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)
Run Code Online (Sandbox Code Playgroud)

我可以用这段代码来做.

  • 代码不对.它输出一些"2014年1月15日,上午12:00" (5认同)
  • 使用`dd`而不是'DD`应该有助于修复"始终一月"问题. (5认同)

idr*_*dız 54

 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
}
Run Code Online (Sandbox Code Playgroud)

针对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
}
Run Code Online (Sandbox Code Playgroud)


Vas*_*huk 17

细节

Swift 4,xCode 9.2/Swift 3,xCode 8.2.1

日期格式扩展

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

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)!)")
Run Code Online (Sandbox Code Playgroud)

结果

在此输入图像描述

更多信息

关于日期格式


小智 15

如果您需要经常将字符串解析为日期,则可能需要将该功能移动到扩展名中.我创建了一个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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

var myDate = myDateString.toDateTime()
Run Code Online (Sandbox Code Playgroud)


Ris*_*gar 9

对于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)
}
Run Code Online (Sandbox Code Playgroud)


Fat*_*tie 5

此质量检查页面上的代码片段是"颠倒的"......

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

链接到Apple doco,说明如何执行此操作:

用于效率的缓存格式化器 创建日期格式化程序并不是一种廉价的操作....缓存单个实例...

使用全球......

let df : DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    return formatter 
}()
Run Code Online (Sandbox Code Playgroud)

然后在任何地方使用该格式化器......

let s = df.string(from: someDate)
Run Code Online (Sandbox Code Playgroud)

要么

let d = df.date(from: someString)
Run Code Online (Sandbox Code Playgroud)

或者在DateFormatter上使用任何其他许多方便的方法.

就这么简单.

(如果你在String上写一个扩展名,你的代码完全是"颠倒" - 你不能使用任何dateFormatter调用!)

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