使用TimeZone的DateFormatter来格式化Swift中的日期
使用TimeZone的DateFormatter来格式化Swift中的日期
如何解析只包含日期信息(没有时间)的日期,比如2018-07-24
?
我尝试了以下代码:
let dateFormatter = DateFormatter()
dateFormat.dateFormat = "yyyy-MM-dd"
dateFormatter.dateFormat = dateFormat
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
dateFormatter.date(from: "2018-07-24")
打印结果是23号
看起来它默认使用00:00:00
作为时间,然后转换为UTC时会导致日期向前一天...
我该如何更改这个行为呢?
问题的原因是使用了不同的时区来格式化和获取日期,导致获取的日期不一致。解决方法是在使用Calendar获取日期组件时,设置相同的时区。
在上面的代码中,首先使用了一个DateFormatter来格式化日期,将时区设置为UTC,然后将字符串"2018-07-24"转换为日期,并将其格式化为"2018-07-24"。这里使用了UTC时区,所以输出的日期也是UTC时区的日期。
接下来,使用Calendar获取日期的组件,将日期的时区设置为当前时区。在我的时区中(GMT+02),使用这段代码获取的日期组件是24。
但是,如果将日历的时区设置为美国的某个地区,例如MDT时区,在这种情况下获取的日期组件是23。
所以,Calendar使用的是本地时区来获取日期组件。因此,如果需要从日期中获取日期组件,请使用与解析日期字符串时相同的时区。
可以通过以下代码设置相同的时区来获取日期组件:
var calendar = Calendar.current
calendar.timeZone = TimeZone(abbreviation: "UTC")!
let day = calendar.component(.day, from: date!)
print(day) // 输出24
这样就可以确保获取的日期组件与解析日期时使用的时区一致。