返回

datetime-我在这里正确使用 java.time 吗?似乎旧的 API 会更容易

发布时间:2022-05-27 15:45:45 264
# php

我没有经常使用java.timeAPI,因为我的工作主要涉及捕获、存储和显示日期和时间,而不以任何方式对其进行操作。但偶尔,我必须做类似的事情:

获取过去 30 天的日期

我还决定,基于其他不相关的经验,人类倾向于认为“过去 30 天”实际上意味着“过去 30 天的一天的开始”,而不仅仅是“现在减去30*24*60*60*1000过去的毫秒数”仅使用 System.currentTimeMillis 和算术就非常容易。

所以我的要求是:

获取过去 30 天的日期,在我的时区的一天的开始

如果我要使用旧 API 执行此操作,我会这样做:

TimeZone zone = ...; // However I get my time zone
Locale locale = ...; // However I get my locale
Calendar now = Calendar.getInstance(zone, locale);
// Reset to midnight
now.set(Calendar.HOUR, 0);
now.set(Calendar.MINUTE, 0);
now.set(Calendar.SECOND, 0);
now.set(Calendar.MILLISECOND, 0);
// Now go back 30 days
now.add(Calendar.DAY, -30);
// done

除了反复调用空白时间部分之外Calendar,它非常简单。它只使用了 3 个类,其中两个是TimeZoneandLocale类,其中只有一个是真正需要的(TimeZone)。

这一次,我决定使用java.time它,因为它“更好”。我真的不知道如何解决它,所以我做了很多互联网搜索以弄清楚如何做各种事情,最后我想出了下面的代码。这不是应该“更容易”吗?

TimeZone zone = ...; // However I get my time zone
ZoneId zid = zone.toZoneId(); // Convert to new kind of time zone
ZonedDateTime date = ZonedDateTime.now(zid);
date = date.minus(Period.ofDays(30)); // Rewind 30 days
date = date.truncatedTo(ChronoUnit.DAYS);
Instant instant = date.toInstant(); // Convert to Instant for comparisons

现在我正在使用6 个不同的类。好的,其中 2 个是常量类型的东西,所以我们可以忽略它们。我必须使用Instant,因为我必须用于比较的所有日期都是java.util.Date,并且Instant是弥合所有差距的类。

这是一个“简单问题”并且java.time旨在解决更复杂的问题吗?

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(2)
按点赞数排序
用户头像