如何获取当前日期和时间

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

我正在寻找c#中等价于DateTime.Now的东西。

409414 次浏览

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

import java.util.Date;


Date d = new Date();

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

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

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

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

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

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

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

我更喜欢使用Calendar对象。

Calendar now = GregorianCalendar.getInstance()

我觉得用起来容易多了。您还可以从Calendar中获取Date对象。

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

Java 日期日历类被很多人认为设计得很糟糕。你应该看一看Joda的时间,一个通常用来代替Java内置日期库的库。

Joda Time中的DateTime.Now等价于:

DateTime dt = new DateTime();

更新

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

DateTime dt = DateTime.now();

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

import org.joda.time.DateTime;


DateTime now = DateTime.now();

在Java 8中,它是:

ZonedDateTime dateTime = ZonedDateTime.now();

博士tl;

Instant.now()

java.time

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

ZonedDateTime

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

ZonedDateTime now = ZonedDateTime.now();

A ZonedDateTime封装:

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

如果没有指定时区,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,使用方便的协调世界时常数

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

时区

您可以轻松地调整到另一个时区,以便向用户显示。使用正确的时区名称从来没有 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 );

Instant

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

__abc3 = __abc4 + __abc5

你可以从ZonedDateTime中提取Instant

Instant instantNow = zdt.toInstant();

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

Instant now = Instant.now();

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()方法使用系统返回当前日期-时间 时钟和默认时区,不是空。它得到电流 来自默认时区中的系统时钟的日期-时间。这将 在默认时区查询系统时钟,获取当前时间 日期-时间。使用这种方法将阻止使用的能力 测试的备用时钟,因为时钟是硬编码的