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

我正在寻找相当于DateTime的东西。现在从c#开始。


当前回答

java.lang.System.currentTimeMillis ();将返回自epoch以来的datetime

其他回答

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

import java.util.Date;

Date d = new Date();

用Javadocs零参数构造函数的话说:

分配Date对象并初始化它,使它表示分配的时间,测量到最近的毫秒。

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

许多人认为Java Date和Calendar类设计得很糟糕。您应该看一看Joda Time,这是一个常用来代替Java内置日期库的库。

相当于DateTime。现在在Joda时间是:

DateTime dt = new DateTime();

更新

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

DateTime dt = DateTime.now();

博士tl;

Instant.now()

java.time

date类已被新的java.util. date类淘汰。Java 8及更高版本中的time包(教程)。旧的java.util.Date/。日历类是出了名的麻烦、混乱和有缺陷。避免它们。

分区日期时间

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

ZonedDateTime now = ZonedDateTime.now();

一个zone datetime封装:

日期。 一天中的时间,具有几分之一秒到纳秒的分辨率。 时区。

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

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

UTC

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

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

Instant instant = Instant.now();

Instant类是java中一个基本的构建块类。时间和可能经常在代码中使用。

当您需要更灵活的格式时,可以转换为OffsetDateTime。指定一个ZoneOffset对象。对于UTC,使用方便的常量For 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 );

即时

或者,要保持UTC,请使用即时。Instant对象表示时间轴上的时刻,以纳秒分辨率表示,始终以UTC为单位。这为分区日期-时间以及时区分配提供了构建块。你可以这样理解:

分区日期时间 = 即时 + 区域 ID

您可以从zone datetime中提取一个Instant。

Instant instantNow = zdt.toInstant();

你可以从速溶开始。这里不需要指定时区,因为Instant总是使用UTC。

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

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

在Java 8中,它是:

ZonedDateTime dateTime = ZonedDateTime.now();