如何获取当前日期和时间
Posted
技术标签:
【中文标题】如何获取当前日期和时间【英文标题】:How to get the current date and time 【发布时间】:2011-01-01 21:20:56 【问题描述】:如何在 Java 中获取当前日期和时间?
我正在寻找与 C# 中的 DateTime.Now
等效的东西。
【问题讨论】:
此问题早于 this Question 以前标记为重复。所以我颠倒了名称,重新打开了这个问题并将较新的问题标记为重复。 【参考方案1】:只需构造一个新的Date
对象,不带任何参数;这会将当前日期和时间分配给新对象。
import java.util.Date;
Date d = new Date();
用the Javadocs的话来说the zero-argument constructor:
分配一个 Date 对象并对其进行初始化,使其表示分配它的时间,精确到毫秒。
确保您使用的是java.util.Date
而不是java.sql.Date
——后者没有零参数构造函数,并且具有一些不同的语义,这是完全不同的对话主题。 :)
【讨论】:
另请注意,GregorianCalendar 和许多类似对象的工作方式相同。因此,无论您使用哪种类型的日期/日历对象,零参数构造函数通常会将对象初始化为当前日期/时间。 来自日期文档:从 JDK 1.1 开始,应使用 Calendar 类在日期和时间字段之间进行转换,并且应使用 DateFormat 类来格式化和解析日期字符串。 请考虑新的 Java8 API - LocalDateTime.now() and ZonedDateTime.now()【参考方案2】:Java Date 和 Calendar 类被许多人认为设计不佳。你应该看看Joda Time,一个常用来代替Java内置日期库的库。
在 Joda Time 中相当于DateTime.Now
是:
DateTime dt = new DateTime();
更新
如 cmets 中所述,最新版本的 Joda Time 有一个DateTime.now()
方法,所以:
DateTime dt = DateTime.now();
【讨论】:
Joda 的当前(2.1) 版本似乎有一个静态 DateTime.now 方法()(可选地接受 DateTimeZone 或 Chronology)。 joda-time.sourceforge.net/apidocs/org/joda/time/… 请注意,此答案发布于 2010 年。Java 8 吸收了 Joda Time 的许多最佳功能。有关详细信息,请参阅official documentation 和许多其他在线文章。【参考方案3】:tl;博士
Instant.now()
java.time
java.util.Date 类已被 Java 8 及更高版本中的新 java.time package (Tutorial) 所取代。旧的 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 instant = Instant.now();
Instant
类是 java.time 中的一个基本构建块类,可能经常在您的代码中使用。
当您需要更灵活的格式设置时,请转换为OffsetDateTime
。指定 ZoneOffset
对象。对于 UTC,请使用方便的 constant for UTC。
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
时区
您可以轻松调整到另一个时区以向用户展示。使用proper time zone name,永远不要使用 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,请使用 Instant
。 Instant
对象代表时间线上的一个时刻,分辨率为纳秒级,始终采用 UTC。这为分区日期时间以及时区分配提供了构建块。你可以从概念上这样想:
ZonedDateTime
=Instant
+ZoneId
您可以从ZonedDateTime
中提取Instant
。
Instant instantNow = zdt.toInstant();
您可以从 Instant 开始。此处无需指定时区,因为Instant
始终采用 UTC。
Instant now = Instant.now();
【讨论】:
我还发布了another answer,其中包含有关重复问题的更多详细信息。【参考方案4】:我更喜欢使用日历对象。
Calendar now = GregorianCalendar.getInstance()
我发现它更容易使用。您还可以从日历中获取日期对象。
http://java.sun.com/javase/6/docs/api/java/util/GregorianCalendar.html
【讨论】:
也可以简单的Calendar.getInstance()
【参考方案5】:
在 Java 8 中是:
ZonedDateTime dateTime = ZonedDateTime.now();
【讨论】:
【参考方案6】:import java.util.Date;
Date now = new Date();
请注意,Date 对象是可变的,如果您想做一些复杂的事情,请使用 jodatime。
【讨论】:
【参考方案7】:java.lang.System.currentTimeMillis();
将返回自纪元以来的日期时间
【讨论】:
适合记录,但需要解析和转换才能显示给用户【参考方案8】:import org.joda.time.DateTime;
DateTime now = DateTime.now();
【讨论】:
【参考方案9】:如果你创建一个新的 Date 对象,默认会设置为当前时间:
import java.util.Date;
Date now = new Date();
【讨论】:
【参考方案10】:Java 对日期和时间用例的支持一直不足。例如,现有的类(如java.util.Date
和SimpleDateFormatter
)不是线程安全的,这可能会导致并发问题。 API中也存在某些缺陷。例如,java.util.Date
中的年份从 1900 开始,月份从 1 开始,天从 0 开始——不是很直观。这些问题导致了第三方日期和时间库的流行,例如Joda-Time
。为了解决新的日期和时间问题,API 专为 Java SE 8 设计。
LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);
根据doc:
方法
now()
使用系统返回当前日期时间 时钟和默认时区,不为空。它获取当前 默认时区中系统时钟的日期时间。这会 查询默认时区的系统时钟,获取当前时区 约会时间。使用此方法将阻止使用 用于测试的备用时钟,因为时钟是硬编码的。
【讨论】:
以上是关于如何获取当前日期和时间的主要内容,如果未能解决你的问题,请参考以下文章