0

我正在从服务器获取日期字符串,例如“2017-08-05T00:30:00.000+02:00”。下面是我的日期格式化程序代码。

 let dateFormatter: DateFormatter = DateFormatter()
 let serverDateString = "2017-08-05T00:30:00.000+02:00"
 dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZZ"
 dateFormatter.locale = Foundation.Locale(identifier: "en_US_POSIX")
 let currentDate: Date = dateFormatter.date(from: serverDateString)!

但它返回 2017-08-04 22:30:00 +0000。这是错误的。有什么建议么?

4

6 回答 6

0
yyyy-MM-dd'T'hh:mm:ss.SSSZZZZZZ

这是您输入字符串的正确日期格式。这是Apple 文档以获取更多描述。

这是我的代码:

var strInputDateString: String = "2017-08-05T00:30:00.000+02:00"
var dateFormat = DateFormatter()
dateFormat.dateFormat = "yyyy-MM-dd'T'hh:mm:ss.SSSZZZZZZ"
    //Set new dateFormate
var date1: Date? = dateFormat.date(from: strInputDateString)
dateFormat.dateFormat = "dd-MM-YYYY hh:mm:ss"
    // Your Desire
var strOutputDateString: String = dateFormat.string(from: date1!)
print("\(strInputDateString)")
print("\(strOutputDateString)")

输出:

Main input String:2017-08-05T00:30:00.000+02:00
Converted String:  05-08-2017 04:00:00

现在,我尝试使用我的自定义转换您的日期格式。它给了我完美的输出。

于 2017-07-29T12:58:25.557 回答
0

您解析日期的代码是正确的:2017-08-05T00:30:00.000+02:00并且2017-08-04 22:30:00 +0000代表相同的时间,只是在不同的时区。你唯一的问题是它Date实际上并没有存储时区

于 2017-07-29T13:16:22.263 回答
0

在 Swift 3 中,您可以将服务器时间字符串更改为 UTC 时间Date

let dateFormatter: DateFormatter = DateFormatter()
var serverDateString = "2017-08-05T00:30:00.000+02:00"
let index = serverDateString.index(serverDateString.startIndex, offsetBy: 19)
serverDateString = serverDateString.substring(to: index)
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
dateFormatter.timeZone = TimeZone.init(identifier: "UTC")
let currentDate: Date = dateFormatter.date(from: serverDateString)!
于 2017-07-29T15:04:43.277 回答
-1

您缺少的步骤是再次使用 DateFormatter 将日期格式化为字符串。当您在日期上使用打印时,它将始终显示 GMT。出于说明目的,我将 TimeZone 设置为 Berlin 以匹配 +2:00 的原始偏移量。

let dateFormatter: DateFormatter = DateFormatter()
let serverDateString = "2017-08-05T00:30:00.000+02:00"
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZZ"

// Hard set to Berlin
dateFormatter.timeZone = TimeZone(identifier: "Europe/Berlin")
let currentDate: Date = dateFormatter.date(from: serverDateString)!

// Your missing step
dateFormatter.string(from: currentDate)

请记住,DateFormatters 是关于:

  • 从字符串解析-df.date(from: String)
  • 从日期格式化-df.string(from: Date)
于 2017-07-29T13:22:40.827 回答
-1

尝试这个

let dateFormatter: DateFormatter = DateFormatter()
let serverDateString = "2017-08-05T00:30:00.000+02:00"
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXX"
dateFormatter.locale = Foundation.Locale(identifier: "en_US_POSIX")
let currentDate: Date = dateFormatter.date(from: serverDateString)!

希望这可以帮助

于 2017-07-29T12:49:13.620 回答
-1

实际上,您的代码很好。我复制了你的数据并在操场上运行它。你想要什么样的格式?

于 2017-07-29T12:54:15.263 回答