编辑:我的解决方案如下。
我有一种与日历相关的应用程序,用户可以向后和向前跳转某些整数天。在午夜时分测试应用程序时,我意识到存在与DST相关的问题,我正在寻找最佳解决方案。
该应用并非真正基于iOS中的任何日历。但是,我显示公历日期和时间,因此用户可以参考熟悉的日期和时间。
其中一次内置跳跃是73天,约为1/5年。使用的常用日期是March equinox +/- 73天的整数倍。例如,当从3月春分跳到73天前的日期时,问题就出现了,因为3月春分很可能是在夏令时,而另一个则不是。这取决于系统上的时区设置。然而,该应用程序与时区无关,所以我宁愿显示时间,好像没有DST这样的东西,但仍然使用本地时区。我希望这是有道理的。
有关如何实现这一目标的任何建议?如果问题太模糊,也许我可以添加更多细节,但我不想通过添加太多来混淆事物。
编辑:我决定从应用程序链接示例屏幕打印来说明正在发生的事情。这张照片: http://victorspictures.com/trollart/h37a90c77#h56122c20 显示今年昼夜平分点的配置。标题说明了如何读取设备。按照图库中的下两张图片查看如何使用该设备计算复活节的日期。无论如何,滑动手势允许用户移动+/-一天或+/- 73天,这是问题出现的地方。我正在为日期显示添加时间,也许这就是我需要做的全部。
解决方案:Celeda的建议
添加了此方法:
- (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]];
答案 0 :(得分:0)
根据您对Hot Licks的回答的评论,看来您有一些数字d
代表自1975年春分以来的几天(1975-03-21 05:57:00 UTC),以及你想在格里高利历上找出相应的日子。
我们可以使用NSDate
,NSCalendar
和NSDateComponents
类来执行此计算。为避免DST的影响,我们需要将日历和格式化程序的时区设置为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的行,以查看DST如何更改结果。
有关详情,请参阅Date and Time Programming Guide。