gpt4 book ai didi

java - 将完整的 Java 日期(例如 8.00am 2013-06-19)转换为一个时间(即 8.00am 1970-01-01)

转载 作者:行者123 更新时间:2023-11-29 07:56:48 26 4
gpt4 key购买 nike

作为某些逻辑的一部分,在我的程序中有必要将一个长的 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 时间(或其他时间包)”之外,还有人对执行此操作有任何其他建议吗?如果可能的话,我需要在尝试其他包之前快速修复。

谢谢!

最佳答案

我认为您违反了关于英国时区的一个鲜为人知的事实:在 Unix 时代,我们实际上使用的是 UTC+1。 Java 正在获取一天中的时间正确(在英国时区内),但名称错误 - 它不应该指定 GMT,而是 BST。这不是英国夏令时的BST;这是英国标准时间中的 BST。是的,就是这么疯狂。

来自relevant wikipedia article :

An inquiry during the winter of 1959–60, in which 180 national organisations were consulted, revealed a slight preference for a change to all-year GMT+1, but the length of summer time was extended as a trial rather than the domestic use of Greenwich Mean Time abolished.[8] A further inquiry during 1966–67 led the government of Harold Wilson to introduce the British Standard Time experiment, with Britain remaining on GMT+1 throughout the year. This took place between 27 October 1968 and 31 October 1971, when there was a reversion to the previous arrangement.

值得记住的是,您最初的问题陈述有些模棱两可:您输入的是 long,这只是自 Unix 纪元以来的毫秒 - 但随后您试图解释它以一天中的小时表示,这立即引出了您需要在哪个时区解释它的问题。您做出了那个决定吗?如果是这样,您应该非常仔细地记录它,并确保您的代码符合它。

最终,我的建议是:

  • 如果您可能可以使用 Joda Time,那就去做吧。它将为您节省数小时和数小时的心痛。
  • 如果您尝试像这样进行日历计算,请考虑在执行任何其他操作之前将日历的时区更改为 UTC;它会让你省去一些心痛
  • 尽可能避免使用 Date.toString() - 您可以使用时区设置为 UTC 的 DateFormatter,然后您会看到预期的结果<

正如 user2340612 的回答所述,要获得“UTC 日的毫秒数”,您可以使用简单的算术 - 但与给定的值不完全相同。我会使用:

long timeOfDay = millisecondsSinceUnixEpoch % TimeUnit.DAYS.toMillis(1);

...但是如果您对给定时刻的 UTC 时间感兴趣,则此方法有效。 (它也会对负输入给出负结果,但你可能不关心这个。)

关于java - 将完整的 Java 日期(例如 8.00am 2013-06-19)转换为一个时间(即 8.00am 1970-01-01),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17187235/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com