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

Equivalent of C#'s DateTime.Now in Java?

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

在C#中它是DateTime.Now


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

1
2
3
import java.util.Date;

Date d = new Date();

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

Allocates a Date object and initializes it so that it represents the time at which it was allocated, measured to the nearest millisecond.

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


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

Joda Time中的DateTime.Now相当于:

1
DateTime dt = new DateTime();

更新

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

1
DateTime dt = DateTime.now();


TL;博士

1
Instant.now()

java.time

java.util.Date类已经被Java 8及更高版本中的新java.time包(教程)所取代。旧的java.util.Date/.Calendar类是出了名的麻烦,令人困惑和有缺陷的。避免他们。

<5233>

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

1
ZonedDateTime now = ZonedDateTime.now();

A ZonedDateTime封装:

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

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

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

世界标准时间

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

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

1
Instant instant = Instant.now();

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

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

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

时区

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

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

生成该日期时间值的字符串表示,已本地化。

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

Instant

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

ZonedDateTime = Instant + ZoneId

您可以从ZonedDateTime中提取Instant

1
Instant instantNow = zdt.toInstant();

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

1
Instant now = Instant.now();


我更喜欢使用Calendar对象。

1
Calendar now = GregorianCalendar.getInstance()

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

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


在Java 8中它是:

1
ZonedDateTime dateTime = ZonedDateTime.now();

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

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


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


1
2
3
import org.joda.time.DateTime;

DateTime now = DateTime.now();

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

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

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

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

根据文件:

The method now() returns the current date-time using the system
clock and default time-zone, not null. It obtains the current
date-time from the system clock in the default time-zone. This will
query the system clock in the default time-zone to obtain the current
date-time. Using this method will prevent the ability to use an
alternate clock for testing because the clock is hard-coded.