使用Java日历时忽略DST
我有一个绘制时间序列图的GUI。 用户通过在文本框中输入值来输入他们想要绘制的日期。 例如,如果他们输入25/07/13 22:00和26/07/13 00:00 ,图表应绘制从25日22:00:00到次日早晨00:00:59的数据。 用户输入的时间被解析为Calendar
对象。
我的问题来自DST。
用户不关心DST,因此他们想要看到的只是这两次之间的图表。 但是, Calendar
对象确实关心DST,因此我的“to”日期当前不是00:00,而是01:00。 (我在伦敦,我们目前是格林威治标准时间+ 1小时的夏令时)。
我想有效地忽略DST,并且当我想绘制图形时,好像一切都是GMT + 0。
我怎样才能做到这一点?
谢谢你们的答案,他们帮我解决了问题。 它归结为我使用Calendar
对象,数据的呈现和存储,以及时间计算的epoch
。
事实certificate, Calendar
set()
方法将考虑到DST。 因此,当我在用户输入的文本框中解析时间值,并对每个单独的Calendar
字段使用set()
, Calendar
对象将根据历史数据知道您刚刚设置的日期是否具有DST应用。 因此,它理解你的意思,例如,GMT + 1,即使你没有意识到它(因为,坦率地说,谁做了什么?!)。
但是 ,当你执行getTimeInMillis()
,返回的epoch
没有时区或DST的概念,因此要匹配当前时区,您必须手动将DST应用于返回的epoch
(如果适用)。 相反,当您在Calendar
对象上使用setTimeInMillis()
时,假设您输入的时间是GMT + 0, 但如果epoch
是当前已应用DST的日期,则Calendar
对象将为您添加它,这意味着你距你原来的+1小时。 要解决此问题,您需要在设置日历之前从epoch
再次减去DST(如有必要)。
所有这些混乱在日间界限上尤其重要,特别是如果你像我一样使用日期分辨率。
如果我理解正确,你需要解析25/07/13 22:00作为GMT日期/时间:
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy HH:mm"); sdf.setTimeZone(TimeZone.getTimeZone("GMT")); Date date = sdf.parse("25/07/13 22:00");
并根据此日期制作日历
Calendar c= Calendar.getInstance(); c.setTime(date);
TimeZone tz = TimeZone.getTimeZone("Etc/GMT0"); DateFormat df = DateFormat.getDateTimeInstance(); df.setTimeZone(tz); System.out.println(df.format(new Date()));
Calendar calendar = Calendar.getInstance(); calendar.set(calendar.DST_OFFSET, 0);
- Arquillian wildfly8.2嵌入式:JBAS014670:初始化模块失败org.jboss.as.logging
- Android解码mp3与MediaCodec。 不要使用MediaExtractor