如何将日期视为没有夏令时调整



编辑:我的解决方案如下。

我有一种与日历相关的应用程序,用户可以前后跳转某些整数天。在午夜左右测试该应用程序时,我意识到存在与夏令时相关的问题,我正在寻找最佳解决方案。

该应用程序并不是真正基于iOS中的任何日历。但是,我显示的是公历日期和时间,这样用户就可以参考熟悉的日期和时间。

其中一个内置的跳跃时间是73天,大约是五分之一年。常用的日期是三月春分+/-73天的整数倍。例如,当从春分点跳到73天前的某个日期时,问题就来了,因为春分点可能在夏令时,而另一个则不是。这取决于系统上的时区设置。然而,该应用程序与时区无关,所以我宁愿显示时间,就好像没有夏令时一样,但仍然使用本地时区。我希望这是有道理的。

关于如何实现这一目标,有什么建议吗?如果问题太模糊,也许我可以添加更多的细节,但我不想添加太多而混淆事情。

编辑:我决定将应用程序中的示例屏幕打印链接起来,以说明发生了什么。这张图片:http://victorspictures.com/trollart/h37a90c77#h56122c20显示了今年春分点的配置。标题解释了如何读取设备。关注图库中的下两张图片,了解如何使用该设备计算复活节日期。

无论如何,滑动手势允许用户移动+/-一天或+/-73天,这就是问题的出现。我在日期显示中添加时间,也许这就是我真正需要做的

解决方案:赛莱达的建议

增加了这种方法:

- (NSDate *)setNoon: (NSDate *)date
{
   NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
   NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date];
   [components setHour:12];
   NSDate *todayNoon = [calendar dateFromComponents:components];
   return todayNoon;
}

然后,无论在哪里进行跳跃,它都被简单地封装在新方法中:

newDate = [self setNoon:[previousCode]];

根据您对Hot Licks答案的评论,您似乎有一些数字d,代表自1975年春分(1975-03-21 05:57:00 UTC)以来的天数,并且您希望在公历上计算出相应的日期。

我们可以使用NSDateNSCalendarNSDateComponents类来执行此计算。为了避免夏令时的影响,我们需要将日历和格式化程序的时区设置为UTC。

NSInteger d = 73 * 189; // days since the 1975 vernal equinox
NSTimeZone *utcTimeZone = [NSTimeZone timeZoneWithName:@"UTC"];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
calendar.timeZone = utcTimeZone;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
formatter.dateFormat = @"yyyy-MM-dd";
formatter.timeZone = utcTimeZone;
NSDateComponents *epochComponents = [[NSDateComponents alloc] init];
epochComponents.year = 1975;
epochComponents.month = 3;
epochComponents.day = 21;
epochComponents.hour = 5;
epochComponents.minute = 57;
epochComponents.timeZone = utcTimeZone;
NSDate *epochDate = [calendar dateFromComponents:epochComponents];
NSLog(@"epochDate=%@", epochDate);
NSLog(@"epochDate from formatter=%@", [formatter stringFromDate:epochDate]);
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
offsetComponents.day = d;
NSDate *computedDate = [calendar dateByAddingComponents:offsetComponents toDate:epochDate options:0];
NSLog(@"computedDate=%@", computedDate);
NSLog(@"computedDate from formatter=%@", [formatter stringFromDate:computedDate]);

尝试在日历和/或格式化程序中注释掉将时区设置为UTC的行,以查看夏令时如何更改结果。

有关更多信息,请阅读日期和时间编程指南

最新更新