繁体   English   中英

如何获取当前日期和时间

[英]How to get the current date and time

如何在 Java 中获取当前日期和时间?

我正在寻找与 C# 中的DateTime.Now等效的东西。

只需构造一个没有任何参数的新Date对象; 这会将当前日期和时间分配给新对象。

import java.util.Date;

Date d = new Date();

用零参数构造函数的 Javadoc的话来说:

分配一个 Date 对象并初始化它,以便它表示它被分配的时间,测量到最接近的毫秒。

确保您使用的是java.util.Date而不是java.sql.Date - 后者没有零参数构造函数,并且具有一些不同的语义,这些语义是完全不同的对话的主题。 :)

许多人认为 Java DateCalendar类的设计很差。 您应该查看Joda Time ,这是一个常用来代替 Java 内置日期库的库。

Joda Time 中DateTime.Now的等价物是:

DateTime dt = new DateTime();

更新

如评论中所述,最新版本的 Joda Time 有一个DateTime.now()方法,因此:

DateTime dt = DateTime.now();

tl;博士

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 个字母的代码,例如ESTIST

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 + ZoneId

您可以从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();
import java.util.Date;   
Date now = new Date();

请注意, Date对象是可变的,如果您想做任何复杂的事情,请使用jodatime

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.DateSimpleDateFormatter )不是线程安全的,这可能会导致并发问题。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM