从4小时前获得日期

ʞɔı*_*ɔıu 22 java datetime date

如何在Java中返回比当前系统时间少4小时的Date对象?

Bal*_*usC 60

最简单的方法之一:

Date date = new Date(System.currentTimeMillis() - (4 * 60 * 60 * 1000));
Run Code Online (Sandbox Code Playgroud)

但是,这不会考虑DST(夏令时).另一种选择是Calendar:

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR_OF_DAY, -4);
Date date = calendar.getTime();
Run Code Online (Sandbox Code Playgroud)

然而,这是一个非常丑陋的API.另一种选择是JodaTime:

DateTime dateTime = new DateTime().minusHours(4);
Date date = dateTime.toDate(); // If you ever need this...
Run Code Online (Sandbox Code Playgroud)

  • @Thor:因为在运行时你不知道基于`System#currentTimeMillis()`是否在最近4个小时内启用/禁用了DST,所以你可能会冒结果时间关闭. (4认同)
  • 第一种方式有效,但我认为最好不要考虑DST*时区转换*.+1提及JodaTime. (2认同)

Ole*_*.V. 8

其他答案是正确的,但我想提供现代答案.现代解决方案使用java.time现代Java日期和时间API.

Instant fourHoursAgo = Instant.now().minus(Duration.ofHours(4));
System.out.println(fourHoursAgo);
Run Code Online (Sandbox Code Playgroud)

这只是打印:

2018-01-31T15:22:21.113710Z
Run Code Online (Sandbox Code Playgroud)

Z最终表示时间打印在UTC -如果你愿意在UTC抵消为零.这个Instant班级是现代的替代品Date,所以我建议你坚持下去.现代API通常使用起来更好,更清洁,设计更好.

请注意让库类为您减法4小时的优点:代码更易于阅读且不易出错.没有有趣的常数,没有读者花时间检查它们是否正确.

如果确实需要旧式Date对象,例如在使用无法更改或不想更改的旧API时,请按以下方式进行转换:

Date oldfashionedDate = Date.from(fourHoursAgo);
Run Code Online (Sandbox Code Playgroud)

链接: Oracle Tutorial trail:Date Time.当然,互联网上也有其他资源,请搜索.


Nic*_*uet 6

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR_OF_DAY, -4);
calendar.getTime();
Run Code Online (Sandbox Code Playgroud)

  • `Calendar.HOUR`是12小时(上午/下午),而不是24小时.你想要`Calendar.HOUR_OF_DAY`.此外,使用`Calendar#getInstance()`factory比手动构建特定于区域的日历更受欢迎. (2认同)