如何获取当年1月1日开始至今的小时数?

How to get the number of hours since the start of January 1 of the current year?

如何获取Java从当年1月1日开始算起的小时数? IE。 1 月 1 日的第一个小时 = 0001 我可以用 JodaTime 或任何其他库来完成这个吗? 谢谢,

使用 java.time package built into Java 8 and later (Tutorial):

ChronoUnit.HOURS.between(
  LocalDateTime.of(LocalDateTime.now().getYear(), 1, 1, 0, 0), 
  LocalDateTime.now())

我认为这是不言自明的

使用 Java 8 API date/time

    LocalDateTime hournow = LocalDateTime.now();
    LocalDateTime startOfYear = LocalDateTime.of(hournow.getYear(), 1, 1, 0, 0);
    long hoursBetween = ChronoUnit.HOURS.between(startOfYear, hournow);
    System.out.println("hours between: " + hoursBetween);

我强烈怀疑许多用户宁愿希望考虑夏令时效应:

ZoneId zi = ZoneId.of("Europe/Paris"); // example

ZonedDateTime now = ZonedDateTime.now(zi);
ZonedDateTime start = ZonedDateTime.of(now.getYear(), 1, 1, 0, 0, 0, 0, zi);
long realDelta = ChronoUnit.HOURS.between(start, now);
System.out.println("hours between: " + realDelta); // 5386

// another way using Instant
Instant i2 = now.toInstant();
Instant i1 = start.toInstant();
System.out.println(i1); // 2014-12-31T23:00:00Z
System.out.println(i2); // 2015-08-13T09:55:53.353Z
System.out.println("duration=" + i1.until(i2, ChronoUnit.HOURS)); // 5386

目前提出的基于 LocalDateTime 且没有任何时区的解决方案会产生不同的结果(这里只有名义持续时间,而不是物理持续时间):

LocalDateTime ldt2 = LocalDateTime.now();
LocalDateTime ldt1 = LocalDateTime.of(ldt2.getYear(), 1, 1, 0, 0);
long hoursBetween = ChronoUnit.HOURS.between(ldt1, ldt2);
System.out.println("hours between: " + hoursBetween); // 5385

java.util.GregorianCalendar 的情况下,结果将与基于 ZonedDateTime 的 Java-8 相同。其他图书馆也提供类似的结果,但我省略了这些细节,因为更重要的是了解 时区对结果的影响