2016-10-04 69 views
-1

我试图获取当前日期为AWS安全凭证的特定格式(YYYYMMD)印刷和我注意到,当我做Date(),天是这是正确的值4:天的日期()和Calendar.dateComponents不匹配

let date = Date() 
    print("\(date)") //2016-10-04 00:56:28 +0000 

现在,我想打印在我渴望这样的格式的日期,但我不断收到当天的值是3:

let calendar = Calendar.current 
    let date = Date() 
    let components = calendar.dateComponents([.day], from: date) 
    print("\(components.day)") //Optional(3) 

S3预计日期将是第四。我怎样才能解决这个问题?

+2

区是什么时候返回的值你的开发手机为?公平地说,在你的时区,日期实际上是午夜前的第三天,但是当你以UTC显示时,它显示为第四天。 –

回答

1

这是因为时差的。 date将返回UTC时间和日期,但calendar将根据设备的时区返回日期和时间。如果您需要在UTC天数只设置日历对象的时区为UTC创建后:

let calendar = Calendar.current 
calendar.timeZone = TimeZone(abbreviation: "UTC")! 

现在,它总是会匹配由Date()

+0

尽管创建新的公历日历并将该日历的时区设置为UTC可能会更好。不会更改当前日历的时区可能会在应用程序的其余部分中弄乱日历操作? –

+0

@DuncanC它只会改变这个“日历”对象的时区。它不会更改“当前”日历。 –

+0

但是,创建一个新的格里历日历可以使其在所有区域中都安全。 –

1

打印时使用

print("\(date)") 

你获得UTC日期和时间,这可能不是你想要的日期。

如果你想在你的本地时区来显示你的约会,创建日期格式和使用:

let dateFormatter = NSdateFormatter() 
let dateFormatter.dateStyle = .medium 
let dateFormatter.timeStyle = .medium 

let dateString = dateFormatter.StringFromDate(date) 
print ("date = \(dateString)") 

如果你这样做了很多,你可能想创建的NSDate displayString的扩展,使您可以使用它来显示日期而无需编写其他代码。

+0

所以Heroku创建了一个签名的请求,其中包含UTC中需要匹配的日期。 – Brosef

+0

创建一个公历并将其时区设置为UTC。 Sam_M的答案显示了如何设置日历的时区,但我建议创建一个新日历,而不是修改当前日历。 –