作为某些逻辑的一部分,在我的程序中需要将长 Java 时间戳(包括年、月等)转换为“短”Java 时间。这应该对应于与原始时间完全相同的小时、分钟和秒,但在 1970 年 1 月 1 日的 1 天内(即介于 0 (00:00:00) 和 86400000 (23:59:59) 之间的值)。一个例子是问题中的转换。
为了执行这个,我认为下面的代码可以工作:
public int convertToTime(long fullTimeStamp) {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(date);
c.set(Calendar.DATE, 1);
c.set(Calendar.MONTH, 0);
c.set(Calendar.YEAR, 1970);
return (int) c.getTimeInMillis();
}
我遇到的问题与时区有关。在英国,我们目前在 BST。使用函数设置所有值后,时间保持不变(例如上午 8 点),但时区更改为 GMT!格林威治标准时间上午 8 点当然与英国夏令时上午 8 点不同,而是等于英国夏令时上午 9 点。
向函数添加一些控制台输出说明了这个问题:
public int convertToTime(long fullTimeStamp) {
System.out.println(new Date(fullTimeStamp)); // correct
Calendar c = Calendar.getInstance();
c.setTimeInMillis(fullTimeStamp);
System.out.println(c.getTime()); // correct
c.set(Calendar.DATE, 1);
c.set(Calendar.MONTH, 0);
c.set(Calendar.YEAR, 1970);
System.out.println(c.getTime()); // incorrect!
return (int) c.getTimeInMillis();
}
程序输出:
Wed Jun 19 12:15:00 BST 2013 // ok
Wed Jun 19 12:15:00 BST 2013 // this makes sense
Thu Jan 01 12:15:00 GMT 1970 // Calendar, stahp!
所需的行为是最后一部分阅读:
Thu Jan 01 11:15:00 GMT 1970
or
Thu Jan 01 12:15:00 BST 1970
这是日历的预期行为吗?我的理解是它使所有未修改的“数字”保持不变,因此如果 HOUR_OF_DAY 的值为 8,则即使修改了时区,它也应保持为 8。
我尝试将日历上的时区(在设置任何值之前)设置为 BST 和 GMT,并且发生了完全相同的行为。我也无法手动添加或删除毫秒以删除 1970 年之后的所有年份,因为我将不得不处理闰年。
除了“使用 Joda 时间(或其他时间包)”之外,是否有人对执行此操作有任何其他建议?如果可能的话,在尝试其他软件包之前,我需要快速修复。
谢谢!