【问题标题】:Wrong Date is Display from DateComponetsDateComponets 显示错误的日期
【发布时间】:2018-03-22 15:06:19
【问题描述】:
let dateString = "2017-10-08T00:12: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)!



let components = Calendar.current.dateComponents(in: TimeZone(identifier: "America/New_York")!, from: date)  

print("Day - \(components.day!)")
print("Month - \(components.month!)")
print("Year - \(components.year!)")

print("Hour - \(components.hour!)")
print("Min - \(components.minute!)")
print("Second - \(components.second!)")


print("Final Date - \(components.date!)")

通过运行上面的代码,我得到了输出

第 7 天
月 - 10
年份 - 2017
小时 - 20
最小 - 12
第二 - 0
最终日期 - 2017-10-08 00:12:00 +0000
但我的预期日期应该是
最终日期 - 2017-10-07 20:12:00 +0000

【问题讨论】:

  • 你的日期是正确的。为什么你认为最终日期应该与原始日期字符串不同?
  • 日期只是一个时间点。它没有时区。
  • 组件反映了原始日期。您还应该打印时区组件
  • 仅供参考 - 在formatter 上设置时区是没有意义的,因为日期字符串包含它自己的时区信息。
  • @LeoDabus 是的,但这里没有这样做。但我应该更清楚一点,我的观点适用于将字符串转换为日期。

标签: swift date calendar nsdatecomponents dateformatter


【解决方案1】:

我得到了解决方案,@Leo Dabus 说时区问题,所以

    let dateString = "2017-10-08T00:12: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)!

    let components = Calendar.current.dateComponents(in: TimeZone(identifier: "America/New_York")!, from: date) 

   //Converting part 
    let gregorian = Calendar(identifier: .gregorian)
    var dateComponents = components
   dateComponents.timeZone = TimeZone.init(identifier: "UTC") //Here is the logic
    let myDate = gregorian.date(from: dateComponents)!
    print(myDate)

现在我得到转换后的日期作为输出。 2017-10-07 20:12:00 +0000

【讨论】:

  • 这是错误的 你不应该得到2017-10-07 20:12:00 +0000 结果
  • 将这些添加到您的原始代码中 formatter.timeZone = TimeZone(identifier:"Americas/New York") formatter.string(from: components.date!)
  • 为什么我不知道纽约的日期
  • 查看我最后的评论结果应该是"2017-10-07T21:12:00.000-03:00"
  • "2017-10-07T21:12:00.000-03:00""2017-10-08T00:12:00.000+00:00"是同一时间点
猜你喜欢
  • 2021-09-10
  • 2013-12-16
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
相关资源
最近更新 更多