如何在Java中获取当前日期和时间?
我正在寻找与C#中的DateTime.Now
等效的方法。
Instant.now()
Java 8及以上版本已经淘汰了java.util.Date类,新的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
始终处于UTC。Instant now = Instant.now();
我更喜欢使用日历对象。
Calendar now = GregorianCalendar.getInstance()
我发现使用它更容易。您还可以从日历中获取一个日期对象。
http://java.sun.com/javase/6/docs/api/java/util/GregorianCalendar.html
Calendar.getInstance()
。 - draw在Java 8中,它是这样的:
ZonedDateTime dateTime = ZonedDateTime.now();
java.lang.System.currentTimeMillis();
将返回自时代以来的日期时间。
import org.joda.time.DateTime;
DateTime now = DateTime.now();
如果您创建一个新的日期对象,默认情况下它将被设置为当前时间:
import java.util.Date;
Date now = new Date();
Java一直缺乏对日期和时间用例的充分支持。例如,现有的类(如java.util.Date
和SimpleDateFormatter
)不是线程安全的,这可能会导致并发问题。此外,API 中存在某些缺陷。例如,在java.util.Date
中,年份从1900年开始,月份从1开始,天数从0开始——不太直观。这些问题导致第三方日期和时间库(例如Joda-Time
)变得流行。为了解决这些问题,为Java SE 8设计了一个新的日期和时间API。
LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);
now()
方法使用系统时钟和默认时区返回当前日期时间,不为null。它从默认时区的系统时钟获取当前日期时间。这将在默认时区中查询系统时钟以获取当前日期时间。使用此方法将防止使用备用时钟进行测试,因为时钟是硬编码的。
Date
方法中的大多数已被弃用,因此在我看来它基本上是无用的。 - Arturo Mendes