【发布时间】:2013-03-05 06:47:43
【问题描述】:
我有一个使用时间表的应用程序。用户选择计划应该开始/结束的时间,然后我将开始/结束时间显示给用户。问题是,显示回来的时间是关闭的,因为 DST 改变了。
我可以解决我的时区(东部时间)的问题,或者我可以解决 GMT 的问题,如果我为 GMT 设置特定情况,阿拉斯加时间仍然是错误的。有什么建议吗?
这是我的代码:
正在显示的时间:
long startTimeMillis = (startHour * 1000 * 60 * 60) + (startMin * 1000 * 60) - getTimeOffset();
getTimeOffset:
TimeZone tz = TimeZone.getDefault();
//deal with GMT weirdness
if (tz.getRawOffset() == 0)
return tz.getRawOffset() + tz.getDSTSavings();
else
return tz.getRawOffset();
我认为我需要类似的东西:
else if(tz.inDaylightTime(new Date()))
return tz.getRawOffset() + tz.getDSTSavings();
但如果我这样做,东部时间会比应有的时间少 1 小时,而阿拉斯加时间会少 2 小时。如果我反其道而行之:(- 而不是 +)
else if(tz.inDaylightTime(new Date()))
return tz.getRawOffset() - tz.getDSTSavings();
那么东部时间比应有的时间多 1 小时,但阿拉斯加时间是正确的。
附录:
我还尝试在每种情况下使用tz.getOffset(new Date().getTime()),而不是tz.getRawOffset()。这实际上是我尝试的第一件事,因为根据谷歌的文档,这个函数应该为你处理夏令时。
结束附录
我也尝试过使用日历,如下所示:
Calendar calendar = GregorianCalendar.getInstance();
return calendar.get(Calendar.ZONE_OFFSET);
这为美国东部标准时间提供了正确的时间,但格林威治标准时间提前 1 小时,阿拉斯加时间落后 1 小时。我已经试过了:
if(tz.inDaylightTime(new Date()))
return calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET);
else
return calendar.get(Calendar.ZONE_OFFSET);
但这让美国东部夏令时间缩短了 1 小时。
我也试过这个:
return tz.getOffset(calendar.get(Calendar.ERA),
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
calendar.get(Calendar.DAY_OF_WEEK),
calendar.get(Calendar.MILLISECOND));
这也让 EDT 缩短了 1 小时。
如果我使用
,我会得到相同的结果GregorianCalendar calendar = new GregorianCalendar(tz);
而不是
Calendar calendar = GregorianCalendar.getInstance();
我该如何正确地做到这一点???
【问题讨论】:
-
好的,你的帖子没有显示用户是如何输入数据的,所以你接受除了
starthour和startminute之外的任何数据,一旦你用它们来计算startTimeMillis,startTimeMillis后面怎么用? -
您可能不需要使用
getRawOffset()或getDSTSavings()。我意识到这很令人困惑; Java 时间实用程序正是 JodaTime 项目如此成功的原因。 -
DST 结果取决于日期(我在您的问题中没有看到任何内容)和确切的 TimeZone 'id',但我希望我有所帮助。因为您非常棒,可以分享您的尝试,并实际检查您的问题,所以我会尽我所能帮助您解决这个问题。如果您使用的日期在 DST 之内(例如今天),那么遵守 DST 的
TimeZones 将比不遵守 DST 的日期早一小时。我最喜欢的例子是中西部:“America/Denver”遵守 DST,而“America/Phoenix”和“MST”则没有。今天凤凰城和 MST 显示 08:00 时,丹佛(夏令时)将显示 09:00,因为它“向前跳跃”。 -
startTimeMillis是计划的开始时间。用户在TimePicker中输入它,稍后用于显示计划的开始时间,并实际启动计划。所以startTimeMillis是下一个时间表的开始时间。
标签: android dst timezone-offset