使用DateFormatter会产生一天(实际上是12小时)的结果。使用以下代码始终生成显示为前一天的日期。我已经在一些应用程序中获得了一段时间,但最终还是开始深入挖掘它。
extension Date
{
func display() -> String
{
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM dd, yyyy"
print(dateFormatter.locale)
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
let txt = dateFormatter.string(from: self)
print(txt)
return txt
}
}
这方面的其他问题建议更改区域设置,因此添加了代码,但我检查了区域设置和实际日期。如果我将8小时添加到日期,我会得到正确的显示结果,但添加少于这个没有做任何事情。正在从“联系人”应用中的生日字段中检索某些日期,这会生成时间为00:00:00 UTC的日期。我似乎需要将日期转换为当地时间?设备上的时区设置为本地时区(太平洋)。这看起来不是很糟糕,但是从日期选择器中检索的日期不是UTC时间,而是在当地时间。由于使用日历类并尝试提取.timezone组件,因此无法通过此方法获得" NSCalendarUnitTimeZone,因此我无法弄清楚如何判断日期在哪个时区。#34;。有关如何创建适用于所有情况的通用日期格式化程序的任何建议吗?
答案 0 :(得分:1)
有几点意见:
如果您的Date
对象位于UTC时区,请将格式化工具的timeZone
设置为TimeZone(secondsFromGMT: 0)
。
如果您在用户界面中显示Date
对象的字符串表示形式,则不要使用locale
en_US_POSIX
}。您希望在设备的默认位置显示它(即,根本不要更改格式化程序的locale
)。在处理内部使用的ISO 8601和RFC 3339日期字符串时,例如,用于与Web服务交换日期字符串时,只使用en_US_POSIX
。
最后,我不会指定dateFormat
字符串,因为并非所有用户都希望MMMM dd, yyyy
格式的日期。例如,英国用户希望它采用d MMMM yyyy
格式。在UI中显示日期时,请指定dateStyle
。或者,如果这些样式都不起作用,请继续指定dateFormat
,但使用setLocalizedDateFormatFromTemplate(_:)
而不是固定字符串进行设置。
因此,为了您的目的,您可以这样做:
extension Date {
var dateString: String {
let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeZone = TimeZone(secondsFromGMT: 0)
return formatter.string(from: self)
}
}
或者,如果您经常打电话,可能需要重复使用格式化程序:
extension Date {
private static let formatterForDateString: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeZone = TimeZone(secondsFromGMT: 0)
return formatter
}()
var dateString: String {
return Date.formatterForDateString.string(from: self)
}
}
答案 1 :(得分:0)
使用timeZone属性获取确切日期,如下所示:
formatter.timeZone = TimeZone(secondsFromGMT: 0)
它会解决你的目的!