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


195

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


如果您使用NSDateFormatter
Alex Peda,2014年


作为以下所有答案的辅助
user3344977 '16

这里的旧答案确实很错误。Apple doco表示,您需要缓存格式化程序。 stackoverflow.com/a/42370648/294884
Fattie

如果您需要任何格式的帮助,请访问nsdateformatter.com
Pedro Luz

Answers:


341

试试这个:

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

要进一步查询,请分别检查Foundation框架的Objective-C和Swift的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

11
找到解决方案后,只需要将此日期格式设置为“ yyyy-MM-dd hh:mm:ss.SSSSxxx”
Shardul 2014年

1
我有这样的日期字符串“ 2014-07-15 06:55:14-0400”,我尝试使用yyyy-MM-dd hh:mm:ssZZZ。但是我无法从字符串中获取日期对象。
iamprem 2015年

2
@Prem,如果您看到的输出是"2014-07-15 10:55:14 +0000"正确的。根据NSDate描述,日期的输出将以差异(此处为格林尼治标准时间-4小时)计算。如果要得到GMT和UTC之间的区别,-0400请检查此参考
x4h1d 2015年

@ x4h1d,嘿,我知道了!我犯了一个hh应该犯的错误HH。谢谢!
iamprem 2015年

3
@ lmiguelvargasf,我想应该是yyyy-MM-dd'T'HH:mm:ss.SSS'Z'。我认为Z这里只是一个角色。记住,Z也有特殊含义。如果要Z指定,basic hms则格式为 yyyy-MM-dd'T'HH:mm:ss.SSSZ
2015年

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)

迅捷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)

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


5
代码不正确。它输出一些“ 2014年1月15日,12:00 AM”
林克林

5
使用dd代替DD应该有助于解决“总是一月”的问题。
Pascal Belloncle 2014年

1
正确的版本是,yyyy-MM-dd否则,分析日期将停留在1月-我更新了答案以反映更改。
佐拉尔

如果我想将当前日期作为字符串传递怎么办。这样行吗?
Arjun Kalidas

@Zorayr,Kittisak:我要淘汰了,可选(2014-07-14 18:30:00 +0000),这意味着一天会减少。我怎样才能解决这个问题 ?
Vineesh TP

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
}

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

17

细节

  • 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)!)")

结果

在此处输入图片说明

更多信息

关于日期格式


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

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

var myDate = myDateString.toDateTime()

1
谢谢。尽管不太有用,但也可以写:var myDate =“ 04-05-2015” .toDateTime()设置测试数据时,我发现这很方便。
Stephen Watson

1
我很确定在这种情况下hh应该是HH
亚历克斯(Alex)

这没有给我指定的格式:var date = NSDate(); 让dateFormatter = NSDateFormatter(); dateFormatter.dateFormat =“ MMMM d,YYYY”; 让myDate = dateFormatter.stringFromDate(date); 最重要的是,如果我使用您的扩展名-> var myDate2 = myDate.toDateTime(); 它给了我一个完全不同的日期,而不是当前日期。
Arjun Kalidas's

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

5

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

苹果提到的第一件事是您缓存了格式化程序...

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

高速缓存格式化程序,以提高效率 创建日期格式化程序并不便宜。...缓存单个实例...

使用全局...

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”等。


无需将它们置于全球范围内。您可以扩展Formatter,只需声明您的属性为静态即可。检查此 stackoverflow.com/a/43658213/2303865
Leo Dabus '17

4

斯威夫特支持扩展,扩展名为您可以到现有的添加新的功能classstructureenumeration,或protocol类型。

您可以通过使用关键字扩展对象来initNSDate对象添加新功能extension

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停止具有带有date参数的初始化程序该怎么办?您将如何解决?我个人更喜欢使用初始化方法,但是我不知道该如何克服这个问题
Mijail 2016年

我有一个问题:我的日期字符串格式如下:“ 2017-03-10 22:16:00 +0000”,我使用了以下格式:“ yyyy-MM-dd hh:mm:ss Z”和以下格式: “ yyyy-MM-dd'T'HH:mm:ss”。但是对于两者,当我这样做时:let beginDate = df.date(from: beginDateString),我得到零!为什么?(df = DateFormatter()
PaulBénéteau17年

4

自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”。但是对于两者,当我这样做时:let beginDate = df.date(from: beginDateString),我得到零!为什么?(df = DateFormatter()
PaulBénéteau17年

4

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

3

对于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

    }
}

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


2

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

 var dataFormatter:NSDateFormatter = NSDateFormatter()
                dataFormatter.dateFormat = "dd-MMMM 'at' HH:mm a"

cell.timeStamplbl.text = dataFormatter.stringFromDate(object.createdAt)

2

这项工作对我来说..

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

1

以下是一些可用于快速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

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

0

您可以尝试此快速代码

    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)

0

SWIFT 5 Xcode 11.0

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

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
}

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


2
这应该如何工作?日期格式化程序未初始化,也没有理由拆分日期的声明和初始化。
Ixx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.