【问题标题】:Swift Date Timezone IssueSwift 日期时区问题
【发布时间】:2018-03-21 09:54:23
【问题描述】:
extension Formatter {
    static let iso8601: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.timeZone = TimeZone.init(identifier: "America/New_York")
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
        return formatter
    }()
}
extension Date {
    var iso8601: String {
        return Formatter.iso8601.string(from: self)
    }
}

extension String {
    var dateFromISO8601: Date? {
        return Formatter.iso8601.date(from: self)   // "Mar 22, 2017, 10:22 AM"
    }
}



let dateFormat:String = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
let strDate: String = "2017-10-09T00:00:00.966Z"
if let dateFromString = strDate.dateFromISO8601
{
    print(dateFromString.iso8601)
}

好的,那么它对 dateFormatter.date(from: sweDate)!) 没有任何作用? 我怎样才能得到字符串值到日期?

据我所知,日期不存储时区,因此无论我在格式化时使用什么时区,它总是打印 UTC 时间。

那么解决方案是什么,因为我必须将我的本地日期与转换后的日期进行比较。我无法与字符串进行比较。 任何帮助表示赞赏。

【问题讨论】:

  • "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 是错误的。通过转义 Z 它不会考虑日期字符串中的时区。 Z 表示 UTC。如果您转义 Z,它会将您的日期字符串解释为当地时间,这是错误的
  • 您可以设置不同的时区,但在使用包含时区的日期格式解析您的日期时也不会产生影响"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 检查此stackoverflow.com/a/28016692/2303865。您可以使用 TimeZone 将日期转换为具有特定语言环境的字符串。
  • @LeoDabus 我认为 Z 没有问题,即使我转义 Z 它仍然输出错误的日期
  • 不要转义字符串中的 Z 表示 UTC。同 +0000 检查我发布的链接
  • 所以你的意思是说我不需要将我的字符串转换为 utc “Z”表示它已经在 utc 中,对吗?

标签: swift date datetime dateformatter


【解决方案1】:

您应该使用日历方法dateComponents(in: TimeZone) 来检查不同时区的相对日期组件,如下所示:

let dateString = "2017-10-09T18:00:00.000Z"
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
let date = formatter.date(from: dateString)!  // "Oct 9, 2017 at 3:00 PM" in Brazil
                                              // "Oct 9, 2017 at 2:00 PM" in New York
let components = Calendar.current.dateComponents(in: TimeZone(identifier: "America/New_York")!, from: date)  //calendar: gregorian (fixed) timeZone: America/New_York (fixed) era: 1 year: 2017 month: 10 day: 9 hour: 14 minute: 0 second: 0 nanosecond: 0 weekday: 2 weekdayOrdinal: 2 quarter: 0 weekOfMonth: 2 weekOfYear: 41 yearForWeekOfYear: 2017 isLeapMonth: false

if 8..<16 ~= components.hour!  {
    print("store is open in NY").  // "store is open in NY\n"
}

【讨论】:

  • 它可以按我的意愿完美运行,感谢@Leo Dabus
  • 完美,但是当我打印 components.date 时仍然是错误的
猜你喜欢
  • 1970-01-01
  • 2016-12-14
  • 2015-05-24
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
相关资源
最近更新 更多