使用TimeZone的DateFormatter来格式化Swift中的日期

13 浏览
0 Comments

使用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时会导致日期向前一天...

我该如何更改这个行为呢?

0
0 Comments

问题的原因是使用了不同的时区来格式化和获取日期,导致获取的日期不一致。解决方法是在使用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

这样就可以确保获取的日期组件与解析日期时使用的时区一致。

0