【问题标题】:Unexpected result after formating string to date [duplicate]将字符串格式化为日期后出现意外结果[重复]
【发布时间】:2018-01-24 11:35:12
【问题描述】:

我已经格式化了一个字符串回溯到基本转换的日期,我得到了完全不同的日期。

import UIKit

extension String {
    func toDate(dateFormat: String) -> Date {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = dateFormat
        return dateFormatter.date(from: self)!
    }
}

let date = "01/24/2018 09:59:24"

print(date.toDate(dateFormat: "MM/dd/YYYY hh:mm:ss"))

为什么减少了大约一个月零一小时?

编辑

import UIKit

extension String {
    func toDate(dateFormat: String) -> Date {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = dateFormat
        dateFormatter.timeZone = TimeZone.current
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        return dateFormatter.date(from: self)!
    }
}

extension Date {
    func toString(_ format: String) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        dateFormatter.timeZone = TimeZone.current
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        return dateFormatter.string(from: self)
    }
}
let date = Date().toString("MM/dd/yyyy hh:mm:ss")
print(date)
print(date.toDate(dateFormat: "MM/dd/yyyy hh:mm:ss"))

结果

01/24/2018 12:48:33
2018-01-23 23:48:33 +0000

【问题讨论】:

  • 添加代码而不是图像。
  • 三件事。首先,您使用的是YYYY 而不是yyyy(详见here)。其次,您没有使用 en_US_POSIX 作为语言环境,这可能导致不正确/无效的结果。第三,打印日期使用 UTC 而不是当地的时区。
  • @the4kman 知道了。我添加了一个locale 作为en_US_POSIX,然后是timeZone。谢谢!
  • ... 对于 24 小时模式,您必须使用 HH
  • @noname:关于“-1h”,见stackoverflow.com/questions/39937019/…

标签: swift


【解决方案1】:

设置区域设置和时区以避免无效结果。扩展的返回值应该是Date?,因为字符串可能不是有效的日期。 并且由于dateFormat 不是可选的,它应该是有效的日期格式,请参阅here 了解更多详细信息。

import UIKit

extension String {
    func toDate(dateFormat: String, locale : Locale? = nil, timezone: TimeZone? = nil) -> Date? { //locale and timezone are optional with a default nil value
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = dateFormat 
        dateFormatter.locale = locale
        dateFormatter.timeZone = timezone
        return dateFormatter.date(from: self)
    }
}

你可以这样使用它:

let string = "01/24/2018 09:59:24"
let myLocale = Locale(identifier: "en_US_POSIX")
let myTimeZone = TimeZone(abbreviation: "PCT")

print(string.toDate(dateFormat: "MM/dd/yyyy HH:mm:ss",
      locale: myLocale,
      timezone: myTimeZone))

【讨论】:

  • 这如何解决问题?您使用与问题中相同的日期格式,其中“YYYY”和“hh”都是错误的,如上面的 cmets 所述。而且(除了问题已经作为重复问题关闭的事实之外),一些解释会比纯代码转储更有帮助。
  • @MartinR 编辑了答案,dateFormat 是这里的用户输入,如有必要,应进行错误处理。
猜你喜欢
  • 2022-01-19
  • 2012-01-07
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
相关资源
最近更新 更多