ios - 带有夏令时的 NSDateFormatter 的时间字符串不正确

标签 ios objective-c swift nsdate nsdateformatter

我在我的应用程序中使用 CET 作为我的默认 timezone。在德国,夏令时将从2015 年 3 月 29 日开始。现在我正在做一些测试,看看我的日期将来是否会正确转换。我使用以下代码对其进行测试。

NSTimeZone *timeZone = [NSTimeZone timeZoneWithAbbreviation:@"CET"];
[NSTimeZone setDefaultTimeZone:timeZone];

NSDate *now = [NSDate date]; // 10 Feb, 2015
NSDate *dateAfter29March = [now dateByAddingMonths:2]; // 10 April, 2015

NSDateFormatter *formatter = [NSDateFormatter new];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZZ"];
[formatter setTimeZone:timeZone];

NSLog(@" NOW DATE -> %@",[formatter stringFromDate:now]);
NSLog(@" DATE AFTER 29 March -> %@",[formatter stringFromDate:dateAfter29March]);

添加月份的类别方法是

- (NSDate *)dateByAddingMonths:(NSInteger) dMonths {
    NSDateComponents *components = [[NSDateComponents alloc] init];
    components.month = dMonths;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    return [calendar dateByAddingComponents:components toDate:self options:0];
}

控制台输出如下:

NOW DATE -> 2015-02-10 18:28:05 +0100
DATE AFTER 29 March -> 2015-04-10 18:28:05 +0200

我预计 3 月 29 日之后的约会时间是 17:28:05,因为现在比白天少一小时。我究竟做错了什么?

PS:我也尝试在标签中设置输出字符串,但没有发生任何变化。

最佳答案

我真的不明白你在提示什么。

您要求操作系统将日期添加两个月。添加两个月意味着它使用日历,并在同一时间返回两个月后的同一天的日期。它应该考虑夏令时的变化,而且确实如此。这就是增加两个月的意思。

假设我们有一个 session ,我们总是在每个月的第一天上午 10 点开会。您希望在上午 10 点开会,无论是否是夏令时。

关于ios - 带有夏令时的 NSDateFormatter 的时间字符串不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28438156/

相关文章:

ios - 触摸单元格时更改 UITableViewCell 的附件类型

ios - 使用 Bool 通过 SwiftUI 动态过滤 @FetchRequest - 显示 true、false 或两者

Swift 3 - AES 加密 Heimdall - 零填充

ios - 缩放在 ScrollView 中不起作用

java - 增强现实尺寸变换

ios - Tint an Image(必须有更简单的方法)

ios - 更改属性 TextView 中一个单词的颜色(objective-c)

ios - NSNotification 被解雇了不止一次?

ios - Facebook SDK iOS 邀请没有 FBWebDialogs 的用户

ios - 以编程方式创建可从多个 View 使用的 UISearchBar