如何获取当前日期和时间


342

如何使用Java获取当前日期和时间?

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


这个问题比老这个问题以前标记为重复。因此,我颠倒了名称,重新打开此问题并将新问题标记为重复。
罗勒·布尔克

Answers:


414

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

import java.util.Date;

Date d = new Date();

用Javadocs的话来说就是零参数构造函数

分配一个Date对象并对其进行初始化,以便它表示分配它的时间(以最近的毫秒为单位)。

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


13
另请注意,GregorianCalendar和许多类似的对象以相同的方式工作。因此,无论使用哪种类型的日期/日历对象,零参数构造函数通常都会将该对象初始化为当前日期/时间。
Peter Di Cecco 2010年

从Date doc开始:从JDK 1.1开始,应该使用Calendar类在日期和时间字段之间进行转换,并且应该使用DateFormat类对日期字符串进行格式化和解析。
Paolo M

9
请考虑使用新的Java8 API-LocalDateTime.now ()和ZonedDateTime.now()
Oleg Mikheev,2014年

59

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

DateTime.NowJoda Time中的等效时间是:

DateTime dt = new DateTime();

更新资料

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

DateTime dt = DateTime.now();

4
Joda的当前版本(2.1)似乎具有静态的DateTime.now method()(可选地接受DateTimeZone或Chronology)。joda-time.sourceforge.net/apidocs/org/joda/time/...
罗曼·Taycher

1
请注意,此答案发布于2010年。Java8吸收了Joda Time的许多最佳功能。有关更多信息,请参见官方文档和许多其他在线文章。
DavidS

36

tl; dr

Instant.now()

java.time

Java 8及更高版本中的新java.time包Tutorial)已使java.util.Date类过时。众所周知,旧的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表示形式。

String output = DateTimeFormatter
    .ofLocalizedDate( FormatStyle.FULL )
    .withLocale( Locale.CANADA_FRENCH )
    .format ( nowMontreal );

Instant

或者,要使用UTC,请使用Instant。一个Instant对象表示在时间轴上一会儿,以纳秒的分辨率,总是在UTC。这为区域日期时间以及时区分配提供了基础。您可以通过以下方式在概念上进行思考:

ZonedDateTime= Instant+ZoneId

您可以提取InstantZonedDateTime

Instant instantNow = zdt.toInstant();

您可以从即时开始。无需像Instant在UTC中一样在此处指定时区。

Instant now = Instant.now();

我还在重复的问题上发布了另一个答案,其中包含更多详细信息。
罗勒·布尔克




10

java.lang.System.currentTimeMillis(); 将返回从纪元开始的日期时间


非常适合记录日志,但是需要解析和转换才能显示给用户
Rishi Dua 2014年

6
import org.joda.time.DateTime;

DateTime now = DateTime.now();

5

如果您创建一个新的Date对象,默认情况下它将被设置为当前时间:

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

3

Java始终没有足够的日期和时间用例支持。例如,现有的类(例如java.util.DateSimpleDateFormatter)不是线程安全的,这可能会导致并发问题。API中也存在某些缺陷。例如,年份java.util.Date从1900开始,月份从1开始,天从0开始,这不是很直观。这些问题导致了第三方日期和时间库的普及,例如Joda-Time。为了解决新的日期和时间,为Java SE 8设计了API。

LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);

根据文档

该方法now()使用系统时钟和默认时区返回当前日期时间,而不是null。它从默认时区的系统时钟获取当前日期时间。这将查询默认时区中的系统时钟,以获取当前日期时间。使用此方法将无法使用备用时钟进行测试,因为该时钟是硬编码的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.