如何获取当前日期和时间

Posted

技术标签:

【中文标题】如何获取当前日期和时间【英文标题】:How to get the current date and time 【发布时间】:2011-01-01 21:20:56 【问题描述】:

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

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

【问题讨论】:

此问题早于 this Question 以前标记为重复。所以我颠倒了名称,重新打开了这个问题并将较新的问题标记为重复。 【参考方案1】:

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

import java.util.Date;

Date d = new Date();

用the Javadocs的话来说the zero-argument constructor:

分配一个 Date 对象并对其进行初始化,使其表示分配它的时间,精确到毫秒。

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

【讨论】:

另请注意,GregorianCalendar 和许多类似对象的工作方式相同。因此,无论您使用哪种类型的日期/日历对象,零参数构造函数通常会将对象初始化为当前日期/时间。 来自日期文档:从 JDK 1.1 开始,应使用 Calendar 类在日期和时间字段之间进行转换,并且应使用 DateFormat 类来格式化和解析日期字符串。 请考虑新的 Java8 API - LocalDateTime.now() and ZonedDateTime.now()【参考方案2】:

Java Date 和 Calendar 类被许多人认为设计不佳。你应该看看Joda Time,一个常用来代替Java内置日期库的库。

在 Joda Time 中相当于DateTime.Now 是:

DateTime dt = new DateTime();

更新

如 cmets 中所述,最新版本的 Joda Time 有一个DateTime.now() 方法,所以:

DateTime dt = DateTime.now();

【讨论】:

Joda 的当前(2.1) 版本似乎有一个静态 DateTime.now 方法()(可选地接受 DateTimeZone 或 Chronology)。 joda-time.sourceforge.net/apidocs/org/joda/time/… 请注意,此答案发布于 2010 年。Java 8 吸收了 Joda Time 的许多最佳功能。有关详细信息,请参阅official documentation 和许多其他在线文章。【参考方案3】:

tl;博士

Instant.now()

java.time

java.util.Date 类已被 Java 8 及更高版本中的新 java.time package (Tutorial) 所取代。旧的 java.util.Date/.Calendar 类是出了名的麻烦、混乱和缺陷。避开他们。

ZonedDateTime

在 java.time 中获取当前时刻。

ZonedDateTime now = ZonedDateTime.now();

ZonedDateTime 封装:

日期。 一天中的时间,与nanosecond 分辨率相差几分之一秒。 时区。

如果没有指定时区,你的 JVM 的当前默认时区会被静默分配。最好指定您想要/预期的时区,而不是隐式依赖默认值。

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z );

UTC

通常最好养成在UTC 时区进行后端工作(业务逻辑、数据库、存储、数据交换)的习惯。上面的代码隐式依赖于 JVM 当前的默认时区。

Instant 类代表 UTC 时间轴中的一个时刻,分辨率为纳秒。

Instant instant = Instant.now();

Instant 类是 java.time 中的一个基本构建块类,可能经常在您的代码中使用。

当您需要更灵活的格式设置时,请转换为OffsetDateTime。指定 ZoneOffset 对象。对于 UTC,请使用方便的 constant for UTC。

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

时区

您可以轻松调整到另一个时区以向用户展示。使用proper time zone name,永远不要使用 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,请使用 InstantInstant 对象代表时间线上的一个时刻,分辨率为纳秒级,始终采用 UTC。这为分区日期时间以及时区分配提供了构建块。你可以从概念上这样想:

ZonedDateTime = Instant + ZoneId

您可以从ZonedDateTime 中提取Instant

Instant instantNow = zdt.toInstant();

您可以从 Instant 开始。此处无需指定时区,因为Instant 始终采用 UTC。

Instant now = Instant.now();

【讨论】:

我还发布了another answer,其中包含有关重复问题的更多详细信息。【参考方案4】:

我更喜欢使用日历对象。

Calendar now = GregorianCalendar.getInstance()

我发现它更容易使用。您还可以从日历中获取日期对象。

http://java.sun.com/javase/6/docs/api/java/util/GregorianCalendar.html

【讨论】:

也可以简单的Calendar.getInstance()【参考方案5】:

在 Java 8 中是:

ZonedDateTime dateTime = ZonedDateTime.now();

【讨论】:

【参考方案6】:
import java.util.Date;   
Date now = new Date();

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

【讨论】:

【参考方案7】:

java.lang.System.currentTimeMillis(); 将返回自纪元以来的日期时间

【讨论】:

适合记录,但需要解析和转换才能显示给用户【参考方案8】:
import org.joda.time.DateTime;

DateTime now = DateTime.now();

【讨论】:

【参考方案9】:

如果你创建一个新的 Date 对象,默认会设置为当前时间:

import java.util.Date;
Date now = new Date();

【讨论】:

【参考方案10】:

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);

根据doc:

方法now()使用系统返回当前日期时间 时钟和默认时区,不为空。它获取当前 默认时区中系统时钟的日期时间。这会 查询默认时区的系统时钟,获取当前时区 约会时间。使用此方法将阻止使用 用于测试的备用时钟,因为时钟是硬编码的。

【讨论】:

以上是关于如何获取当前日期和时间的主要内容,如果未能解决你的问题,请参考以下文章

如何获取当前日期和时间

如何自动获取当前日期和时间到日期时间字段

如何获取当前的日期和时间

如何在 Kotlin 中获取当前的本地日期和时间

在 Laravel 中获取当前日期、时间和日期

如何使用 PHP 获取当前日期和时间 [重复]