[英]How to get the current date and time
如何在 Java 中获取当前日期和时间?
我正在寻找与 C# 中的DateTime.Now
等效的东西。
Instant.now()
java.util.Date 类已被 Java 8 及更高版本中的新java.time 包( Tutorial ) 过时。 旧的 java.util.Date/.Calendar 类是出了名的麻烦、混乱和有缺陷。 避开它们。
ZonedDateTime
在 java.time 中获取当前时刻。
ZonedDateTime now = ZonedDateTime.now();
ZonedDateTime
封装了:
如果未指定时区,则以静默方式分配 JVM 的当前默认时区。 最好指定您想要/预期的时区,而不是隐式依赖默认值。
ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z );
通常最好养成在UTC时区进行后端工作(业务逻辑、数据库、存储、数据交换)的习惯。 上面的代码隐式依赖于 JVM 的当前默认时区。
Instant
类以 UTC 时间表示时间轴中的一个时刻,分辨率为纳秒。
Instant instant = Instant.now();
Instant
类是 java.time 中的基本构建块类,可能经常在您的代码中使用。
当您需要更灵活的格式设置时,请转换为OffsetDateTime
。 指定一个ZoneOffset
对象。 对于 UTC 使用方便的常量 UTC 。
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
您可以轻松调整到另一个时区以向用户展示。 使用正确的时区名称,不要使用 3-4 个字母的代码,例如EST
或IST
。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime nowMontreal = instant.atZone( z );
生成本地化的该日期时间值的字符串表示形式。
String output = DateTimeFormatter
.ofLocalizedDate( FormatStyle.FULL )
.withLocale( Locale.CANADA_FRENCH )
.format ( nowMontreal );
Instant
或者,要保持 UTC,请使用Instant
。 Instant
对象表示时间轴上的一个时刻,以纳秒分辨率表示,始终采用 UTC。 这提供了分区日期时间的构建块,以及时区分配。 你可以从概念上这样想:
您可以从ZonedDateTime
提取Instant
。
Instant instantNow = zdt.toInstant();
您可以从 Instant 开始。 无需在此处指定时区,因为Instant
始终采用 UTC。
Instant now = Instant.now();
我更喜欢使用 Calendar 对象。
Calendar now = GregorianCalendar.getInstance()
我发现与它合作要容易得多。 您还可以从 Calendar 中获取 Date 对象。
http://java.sun.com/javase/6/docs/api/java/util/GregorianCalendar.html
在 Java 8 中,它是:
ZonedDateTime dateTime = ZonedDateTime.now();
java.lang.System.currentTimeMillis();
将返回自纪元以来的日期时间
import org.joda.time.DateTime;
DateTime now = DateTime.now();
如果你创建一个新的 Date 对象,默认情况下它会被设置为当前时间:
import java.util.Date;
Date now = new Date();
Java 对日期和时间用例的支持一直不够。 例如,现有的类(例如java.util.Date
和SimpleDateFormatter
)不是线程安全的,这可能会导致并发问题。 API 中也存在某些缺陷。 例如, java.util.Date
从 1900 开始,月从 1 开始,天从 0 开始——不是很直观。 这些问题导致了第三方日期和时间库的流行,例如Joda-Time
。 为了解决新的日期和时间 API 是为 Java SE 8 设计的。
LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);
根据文档:
now()
方法使用系统时钟和默认时区返回当前日期时间,而不是 null 。 它从默认时区的系统时钟中获取当前日期时间。 这将查询默认时区中的系统时钟以获取当前日期时间。 使用此方法将阻止使用备用时钟进行测试的能力,因为该时钟是硬编码的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.