相当于C#的DateTime.Now在Java中?

问题

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

在C#中它是DateTime.Now


#1 热门回答(405 赞)

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

import java.util.Date;

Date d = new Date();

the Javadocsforthe zero-argument constructor的话说:

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

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


#2 热门回答(58 赞)

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

相当于Joda Time的2667683664是:

DateTime dt = new DateTime();

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

DateTime dt = DateTime.now();

#3 热门回答(29 赞)

#tl;博士

Instant.now()

#java.time

Java 8及更高版本中的newjava.time package(Tutorial)已经过时了java.util.Date类。旧的java.util.Date/.Calendar类是出了名的麻烦,令人困惑和有缺陷的。避免他们。

#ZonedDateTime

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

ZonedDateTime now = ZonedDateTime.now();

AZonedDateTimeencapsulates:

  • 日期。
  • 时间,分辨率为几分之一秒到纳秒。
  • 时区。

如果未指定时区,则会以静默方式分配JVM的当前默认时区。最好指定所需/预期的时区,而不是默认依赖。

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

世界标准时间

通常更好地养成所有inUTC时区的后端工作(业务逻辑,数据库,存储,数据交换)的习惯。上面的代码隐式依赖于JVM的当前默认时区。

Instantclass表示UTC时间轴中的一个时刻,分辨率为纳秒。

Instant instant = Instant.now();

Instantclass是java.time中的基本构建块类,可以在代码中经常使用。

如果你需要更灵活的格式化,请转换为OffsetDateTime。指定aZoneOffset对象。对于UTC,请使用handyconstant for UTC

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

时区

你可以轻松调整到另一个时区以呈现给用户。使用aproper time zone name,neverthe 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 );

#即时

或者,要保持UTC,请使用Instant。 AnInstantobject代表时间轴上的一个时刻,达到纳秒分辨率,始终为UTC。这为分区日期时间提供了构建块,并提供了时区分配。你可以通过这种方式在概念上考虑它:

ZonedDateTime = Instant ZoneId

你可以从aZonedDateTime中提取3119722017。

Instant instantNow = zdt.toInstant();

你可以从一个瞬发开始。此处无需指定时区,因为Instant始终为UTC。

Instant now = Instant.now();