在iphone中找不到合适的日期格式化程序(DateFormatter)

时间:2017-07-29 12:42:38

标签: ios iphone swift nsdateformatter dateformatter

我从服务器获取日期字符串,如“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。哪个错了。有什么建议吗?

6 个答案:

答案 0 :(得分:0)

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

这是输入字符串的正确日期格式。以下是the Apple Document以获取更多说明。

这是我的代码:

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

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

答案 1 :(得分:0)

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

答案 2 :(得分: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)!

答案 3 :(得分:-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)!

希望这有帮助

答案 4 :(得分:-1)

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

答案 5 :(得分:-1)

您缺少的步骤是再次使用DateFormatter将日期格式化为字符串。在日期使用打印时,它将始终显示GMT。为了便于说明,我将TimeZone设置为柏林以匹配原始偏移量+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)