在 Java/Scala 中,如何使用最少的代码/以最优雅的方式以秒为单位获取特定的 UTC 日期?

In Java/Scala how to get specific UTC date in seconds with minimal amount of code/ in most elegant way?

更具体地说,我需要:

// seconds from Jan 1 2010
val currentAerospikeTime = (new Date().getTime - new Date(110, 0, 1).getTime)/1000;

但它使用了已弃用的 Date 构造函数,所以我收到警告。但是在 Scala 中,没有办法关闭单行警告(我不想完全关闭它)。那么我该如何重写它,使其更简洁并让它在没有警告的情况下编译呢?

也许我遗漏了一些东西,但我找不到一个捷径来做到这一点,无论是 Java 8 API 还是 Joda 库(没有彻底研究它) ,但我也不想只为这一行添加库)。

与其在 class 日期中使用构造函数,不如试试 Calendar 怎么样?

Calendar.set(year + 1900, month, date);

这是您要查找的已弃用构造函数的 javadoc 中推荐的内容。

如何使用 ChronoUnit#between 来解决这个问题,例如:

ChronoUnit.SECONDS.between(
    LocalDate.of(2010, 1, 1).atStartOfDay(ZoneId.of("Z")), 
    ZonedDateTime.now());

或者,非常简洁:

(System.currentTimeMillis() - 1262304000000L) / 1000;

我建议为此使用新时间 API(基于 Joda 时间):

long diffInSeconds = Duration.between(Instant.parse("2010-01-01T00:00:00Z"), Instant.now()).getSeconds();

我不喜欢 Calendar 解决方案的地方:

  • 从哪里获取 Calendar 实例?您必须确保其中包含的时间(小时、分钟...)也是您想要的时间。
  • 旧的API,越新的越闪亮;)

开个玩笑,较新的 API 确实更精确。 我不会在那里使用 getSeconds() 方法,而是坚持使用 Duration 对象。我刚刚包含它是为了证明您可以获得完全相同的东西(但是恕我直言 Duration 是一种更清晰的类型...持续时间...比 long)。

在Java8和JodaTime中有一个Duration的概念。

自 1-1-2010 以来的秒数可以通过(java 8 示例)

确定
LocalDateTime jan2010 = LocalDate.of(2010,1,1).atStartOfDay(); // can also pass a ZoneId here
Long secondsSince2010 = Duration.of(jan2010, LocalDateTime.now()).getSeconds();

JodaTime 的解决方案类似,只是对象和方法的构造略有不同。