【发布时间】:2013-02-08 12:53:15
【问题描述】:
编辑:我的解决方案如下。
我有一种与日历相关的应用程序,用户可以在其中前后跳转特定整数天数。在午夜左右测试应用程序时,我意识到存在与 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]];
【问题讨论】:
-
如果您的日期在中午而不是午夜前后跳跃会有帮助吗(然后如果需要,在流程结束时转换回午夜以进行数据库存储/显示)?这是一种技巧,但它可能比“真正”的解决方案更容易解决您的问题。
-
我想到了这一点,并开始在脑海中思考如何去做。我的应用程序的时代是 1975 年春至,即当地时间午夜前 3 分钟,起初我认为午夜前几分钟是问题,所以我将时代切换到午夜,这只是将问题转移了一个多小时。我发现了这一点,因为我做了大约一个小时的同类测试,呵呵。我在想也许我应该做一些事情,比如获取本地时区,检查 DST 是否生效,然后将时区设置为与 GMT 的偏移量,而不是使用时区名称。
-
我不是 iOS 程序员,所以我不能这么说,但总的来说,每当你尝试使用整数而不是日期时,你都会遇到这样的问题。日期/时间库的良好实现会考虑 DST 和时区。 “一天”并不总是 24 小时,它可能是 23、24、25 甚至介于两者之间的一小部分 - 取决于有效的 DST 规则。
-
@Matt,我使用的是日期对象,而不是整数。对于有问题的设备,“一天”并不总是 24 小时,因为该设备根本不计算小时数。该设备的基本单位是一天。应用程序中的当地时间午夜更改日期。
-
如果没有 DST,您的计算就会出错,并且您向用户显示的日期也会不正确。某个日期+/-某个天数应该包括夏令时,否则计算错误,你“错过”了一天。