在Swift 3中将字符串转换为日期类型

31

我有这个结构:

struct message {

  var id: String = "0"
  var text: String = ""
  var date: Date!
  var status: String = "" 
}

我必须从数据库中加载这个结构,它导出为String格式,包括date。所以我编写了以下代码将String转换为Date类型:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.timeZone = NSTimeZone(abbreviation: "UTC") as TimeZone!
let dataDate = dateFormatter.date(from: elemMessage["date"] as! String)!

我将其加载到结构中:

message(id: elemMessage["id"] as! String, text: elemMessage["text"] as! String, date: dataDate as! Date, status: elemMessage["status"] as! String)

但是我收到了这个警告:"从Date转换为不相关的类型Date总是失败的"

所以如果我运行应用就会失败。

我该如何解决这个问题,结构体中的date变量必须是Date类型。

谢谢。


与问题无关,但是:您确定一个空文本或消息状态有意义吗?这似乎是一个相当不合理的默认值。 - Alexander
你展示的代码引起了不同的错误:错误:不正确的参数标签。(data:需要改为date:吗?)请展示与引起问题的代码完全相同的代码。你最好也展示一下elemMessage是如何声明的。这不是一个关键问题,但你最好使用UpperCamelCase来命名类型名称。 - OOPer
抱歉,参数标签为 date: 的复制错误。 elemMessage 是从数据库解析的 JSON,并且它可以正常工作。 我在 date 上出现了错误。 - Paolo Gdf
Swift是一种类型推断语言。var id = "0" - Leo Dabus
你怎么知道你的日期是UTC?那个格式看起来像是本地时间。如果它是UTC,它应该有一个Z或+0000。 - Leo Dabus
请注意,您应该以大写字母开头命名您的类和结构。 - Leo Dabus
3个回答

84

你可以使用以下代码将字符串 Date 转换为 Date/NSDate

Swift 3.2Swift 4.2

字符串转日期

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy" //Your date format
dateFormatter.timeZone = TimeZone(abbreviation: "GMT+0:00") //Current time zone
//according to date format your date string
guard let date = dateFormatter.date(from: "01-01-2017") else {
    fatalError()
}
print(date) //Convert String to Date

日期转字符串

dateFormatter.dateFormat = "MMM d, yyyy" //Your New Date format as per requirement change it own
let newDate = dateFormatter.string(from: date) //pass Date here
print(newDate) //New formatted Date string

输出:-

2017-01-11 00:07:00 +0000
Jan 11, 2017

输出屏幕。


1
我使用了你的代码,但是在加载到消息结构体时出现错误:无法将类型为'Date?'的值转换为预期的参数类型'Date!' - Paolo Gdf
1
请注意在iOS中需要缓存日期格式化器:https://dev59.com/uWAf5IYBdhLWcg3wUBX4#42370648 - Fattie
1
@Andand Nimje: 你有没有注意到,在转换之后会减少一天? - Vineesh TP
5
“mm”不应该大写吗? - mask8
2
转换为日期后,不起作用......日期显示不正确。 - Pulkit Kumar Singh
显示剩余9条评论

17

Swift 4 ISO

let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.timeZone = TimeZone.autoupdatingCurrent
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

5
 func getDateFromString(dateStr: String) -> (date: Date?,conversion: Bool)
{
    let calendar = Calendar(identifier: Calendar.Identifier.gregorian)
    let dateComponentArray = dateStr.components(separatedBy: "/")

    if dateComponentArray.count == 3 {
        var components = DateComponents()
        components.year = Int(dateComponentArray[2])
        components.month = Int(dateComponentArray[1])
        components.day = Int(dateComponentArray[0])
        components.timeZone = TimeZone(abbreviation: "GMT+0:00")
        guard let date = calendar.date(from: components) else {
            return (nil , false)
        }

        return (date,true)
    } else {
        return (nil,false)
    }

}

//输入:"23/02/2017"

//输出:(2017-02-23 18:30:00 +0000,真)


不安全的代码以及为什么你在 Swift 类中使用 NS 类(如 NSCalendar、NSDateComponents)? - nitin.agam
1
谢谢指出,请检查一下。 - Jeet Gandhi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接