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

Java 如何获取当前日期和时间,java,datetime,Java,Datetime,如何获取Java中的当前日期和时间 我正在寻找与日期时间等价的东西。现在从C#开始。只需构造一个新的日期对象,不带任何参数;这将为新对象指定当前日期和时间 import java.util.Date; Date d = new Date(); 用for的话来说: 分配日期对象并对其进行初始化,使其表示分配日期对象的时间,以最接近的毫秒为单位 确保您使用的是java.util.Date而不是java.sql.Date——后者没有零参数构造函数,并且具有一些不同的语义,这是一个完全不同的对话的主

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


我正在寻找与日期时间等价的东西。现在从C#开始。

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

import java.util.Date;

Date d = new Date();
用for的话来说:

分配日期对象并对其进行初始化,使其表示分配日期对象的时间,以最接近的毫秒为单位

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


请注意,对象是可变的,如果要执行任何复杂的操作,请使用。

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

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

我更喜欢使用日历对象

Calendar now = GregorianCalendar.getInstance()
我发现和他一起工作要容易得多。您还可以从日历中获取日期对象

许多人认为Java和类的设计很差。您应该看看,一个常用于替代Java内置日期库的库

相当于
DateTime。现在Joda Time中的
是:

DateTime dt = new DateTime();
更新

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

DateTime dt = DateTime.now();

java.lang.System.currentTimeMillis()将返回自纪元以来的日期时间,在Java 8中,它是:

import org.joda.time.DateTime;

DateTime now = DateTime.now();
ZonedDateTime dateTime = ZonedDateTime.now();
tl;博士 java.time java.util.Date类已被Java8及更高版本中的new()过时。旧的java.util.Date/.Calendar类是出了名的麻烦、混乱和缺陷。避开它们

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

ZonedDateTime now = ZonedDateTime.now();
A封装了:

  • 日期
  • 一天中的某个时间,距离分辨率只有几分之一秒
  • 时区
如果未指定时区,JVM的当前默认时区将以静默方式分配。与隐式依赖默认时区相比,最好指定所需/预期时区

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z );
UTC 通常最好养成在时区内完成后端工作(业务逻辑、数据库、存储、数据交换)的习惯。上面的代码隐式地依赖于JVM的当前默认时区

Instant
类以UTC为单位表示时间线上的一个瞬间,分辨率为纳秒

Instant instant = Instant.now();
Instant
类是java.time中的一个基本构造块类,可能经常用于代码中

当您在格式化方面需要更大的灵活性时,请将其转换为。指定一个对象。对于UTC,请使用handy

时区 您可以轻松地调整到另一个时区,以便向用户演示。使用a,切勿使用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 );
Instant
或者,要保持UTC,请使用。
即时
对象表示时间线上的一个时刻,分辨率为纳秒,始终以UTC为单位。这为分区日期时间以及时区指定提供了构建块。你可以这样从概念上考虑:

=+

您可以从
ZoneDateTime
提取
即时

Instant instantNow = zdt.toInstant();
你可以从瞬间开始。无需在此处指定时区,因为
Instant
始终以UTC为单位

Instant now = Instant.now();

Java对日期和时间用例的支持总是不够。例如,现有类(如
java.util.Date
SimpleDataFormatter
)不是线程安全的,这可能会导致并发问题。API中也存在某些缺陷。例如,
java.util.Date
中的年从1900开始,月从1开始,天从0开始——这不是很直观。这些问题导致了第三方日期和时间库的流行,如
Joda-time
。为了解决这个问题,我们为JavaSE8设计了一个新的日期和时间API

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

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


还要注意,GregorianCalendar和许多类似对象的工作方式相同。因此,无论您使用哪种类型的日期/日历对象,零参数构造函数通常都会将对象初始化为当前日期/时间,日历类应该用于在日期和时间字段之间转换,DATEFrand类应该用于格式化和解析日期字符串。请考虑新的Java8 API——当前(2.1)焦达版本似乎具有静态数据类型。现在方法()(可选地接受DATETMETZORD或年表)。请注意,这个答案是在2010年发布的。Java8吸收了Joda Time的许多最佳特性。有关详细信息,请参阅和许多其他联机文章。或者它可以是
Calendar.getInstance()
用于日志记录,但需要解析和转换才能显示给用户。我还发布了关于重复问题的更多详细信息。此问题比以前标记为重复的问题更旧。因此,我颠倒了名称,重新打开这个问题,并将较新的问题标记为重复问题。
Instant instantNow = zdt.toInstant();
Instant now = Instant.now();
LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);