0

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

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

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

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

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

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

无论如何,滑动手势允许用户移动 +/- 1 天或 +/- 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]];
4

1 回答 1

0

根据您对 Hot Licks 的回答的评论,您似乎有一些数字d代表自 1975 年春分(UTC 时间为 1975 年 3 月 21 日 05:57:00)以来的天数,并且您想找出相应的日期公历。

我们可以使用NSDateNSCalendarNSDateComponents类来执行这个计算。为了避免 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 如何更改结果。

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

于 2013-02-22T20:17:30.457 回答