在Java中等价于C#的DateTime.Now?

如何在Java中获取当前date?

在C#中是DateTime.Now

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

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

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

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

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

Java date和日历类被许多人认为是devise不佳。 你应该看看Joda Time ,一个通常用来代替Java内置date库的库。

Joda Time中的DateTime.Now相当于:

 DateTime dt = new DateTime(); 

更新

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

 DateTime dt = DateTime.now(); 

TL;博士

 Instant.now() 

java.time

java.util.Date类已经在Java 8及更高版本中被新的java.time包 ( Tutorial )所取代 。 旧的java.util.Date/.Calendar类是非常麻烦,混乱和有缺陷的。 避免他们。

ZonedDateTime

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

 ZonedDateTime now = ZonedDateTime.now(); 

ZonedDateTime封装了:

  • date。
  • 时间,以几分之一秒到纳秒的分辨率。
  • 时区。

如果没有指定时区,则您的JVM的当前默认时区将被静默分配。 更好地指定您想要的/预期的时区,而不是隐式地依靠默认值。

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

世界标准时间

一般来说,更好的做法是在UTC时区内完成后端工作(业务逻辑,数据库,存储,数据交换)。 上面的代码隐含地依赖于JVM当前的默认时区。

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

 Instant instant = Instant.now(); 

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

如果您需要更多的格式化灵活性,请转换为OffsetDateTime 。 指定一个ZoneOffset对象。 UTC使用方便的常数 。

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

时区

您可以轻松调整到另一个时区,以便呈现给用户。 使用适当的时区名称 , 不要使用诸如ESTIST类的3-4字母代码。

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

生成该date时间值的string表示,本地化。

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

Instant

或者,保持UTC,使用InstantInstant对象表示时间轴上的一个时刻,以毫微秒的分辨率,始终以UTC表示。 这提供了分区date时间的构build块以及时区分配。 你可以这样概念地思考:

ZonedDateTime = Instant + ZoneId

您可以从ZonedDateTime提取Instant ZonedDateTime

 Instant instantNow = zdt.toInstant(); 

你可以开始一个即时。 无需在此处指定时区,因为Instant始终采用UTC。

 Instant now = Instant.now(); 

我更喜欢使用日历对象。

 Calendar now = GregorianCalendar.getInstance() 

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

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

在Java 8中它是:

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

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

java.lang.System.currentTimeMillis(); 将返回自时代以来的date

 import org.joda.time.DateTime; DateTime now = DateTime.now(); 

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

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

对于date和时间用例,Java一直得不到足够的支持。 例如,现有的类(如java.util.DateSimpleDateFormatter )不是线程安全的,可能会导致并发问题。 API也有一些缺陷。 例如, java.util.Date年份从1900开始,月份从1开始,并且天从0开始 – 不太直观。 这些问题导致第三方date和时间库的stream行,如Joda-Time 。 解决新的date和时间API是为Java SE 8devise的。

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

根据文档 :

now()方法使用系统时钟和默认时区返回当前的date时间,而不是null 。 它从默认时区的系统时钟获取当前date时间。 这将在默认时区查询系统时钟以获取当前date时间。 使用这种方法会阻止使用备用时钟进行testing,因为时钟是硬编码的。