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

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

评论

该问题早于先前标记为重复的问题。因此我颠倒了名称,重新打开此问题并将新问题标记为重复。

#1 楼

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

import java.util.Date;

Date d = new Date();


零参数构造函数的Javadocs语言:


分配一个Date对象并对其进行初始化,以便它表示分配给它的时间(以最近的毫秒为单位)。不是java.util.Date-后者没有零参数构造函数,并且语义有所不同,这是完全不同的对话的主题。 :)

评论


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

– Peter Di Cecco
2010年1月6日在1:02

从日期文档开始:从JDK 1.1开始,应使用Calendar类在日期和时间字段之间进行转换,而DateFormat类应用于格式化和解析日期字符串。

– Paolo M
2013年8月7日14:06

请考虑新的Java8 API-LocalDateTime.now()和ZonedDateTime.now()

–奥列格·米克海耶夫(Oleg Mikheev)
2014-12-9 6:36



#2 楼

许多人认为Java Date和Calendar类的设计不佳。您应该看一下Joda Time,它是代替Java的内置日期库常用的库。 br />
更新

如注释中所述,最新版本的Joda Time具有DateTime.Now方法,因此:

DateTime dt = new DateTime();


评论


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

–罗马·泰切(A. Taycher)
2012年9月24日12:52

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

– DavidS
16年2月2日在20:46

#3 楼

tl; dr

Instant.now()


java.time

新的java.time包已淘汰了java.util.Date类(教程)在Java 8及更高版本中。众所周知,旧的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

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

Instant类表示UTC时间轴中的时刻,分辨率为纳秒。 >
Instant类是java.time中的基本构建块类,可能经常在您的代码中使用。

当您需要更大的格式化灵活性时,请转换为OffsetDateTime。指定一个ZoneOffset对象。对于UTC,请使用UTC的方便常量。

Instant instant = Instant.now();


时区

您可以轻松地调整到另一个时区以呈现给用户。请使用正确的时区名称,切勿使用3-4个字母代码,例如ESTIST

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

Instant

或者,要保留UTC,请使用Instant。一个Instant对象始终以UTC表示时间轴上的某个时刻,达到纳秒分辨率。这为区域日期时间以及时区分配提供了基础。您可以从概念上这样思考:


ZonedDateTime = Instant + ZoneId


您可以从Instant中提取ZonedDateTime

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime nowMontreal = instant.atZone( z );


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

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


评论


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

–罗勒·布尔克
16 Sep 7 '21:45



#4 楼

我更喜欢使用Calendar对象。

Calendar now = GregorianCalendar.getInstance()


我发现使用它要容易得多。您还可以从日历中获取Date对象。

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

评论


或者可以只是Calendar.getInstance()

–画
13年5月4日在3:36

#5 楼

在Java 8中为:

ZonedDateTime dateTime = ZonedDateTime.now();


#6 楼

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


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

#7 楼

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

评论


适合记录日志,但需要解析和转换才能显示给用户

– Rishi Dua
2014年7月24日在8:40

#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。为了解决新的日期和时间,为Java SE 8设计了API。

LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);
根据文档:



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