使用DateFormatter会产生一天结束的结果

时间:2018-01-02 19:41:20

标签: date swift3 dateformatter

使用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;。有关如何创建适用于所有情况的通用日期格式化程序的任何建议吗?

2 个答案:

答案 0 :(得分:1)

有几点意见:

  1. 如果您的Date对象位于UTC时区,请将格式化工具的timeZone设置为TimeZone(secondsFromGMT: 0)

  2. 如果您在用户界面中显示Date对象的字符串表示形式,则要使用locale en_US_POSIX }。您希望在设备的默认位置显示它(即,根本不要更改格式化程序的locale)。在处理内部使用的ISO 8601和RFC 3339日期字符串时,例如,用于与Web服务交换日期字符串时,只使用en_US_POSIX

  3. 最后,我不会指定dateFormat字符串,因为并非所有用户都希望MMMM dd, yyyy格式的日期。例如,英国用户希望它采用d MMMM yyyy格式。在UI中显示日期时,请指定dateStyle。或者,如果这些样式都不起作用,请继续指定dateFormat,但使用setLocalizedDateFormatFromTemplate(_:)而不是固定字符串进行设置。

  4. 因此,为了您的目的,您可以这样做:

    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)

它会解决你的目的!