如何在Java中获取当前日期和时间?
我正在寻找c#中等价于DateTime.Now的东西。
DateTime.Now
只需要构造一个新的Date对象,不带任何参数;这将为新对象分配当前日期和时间。
Date
import java.util.Date; Date d = new Date();
用Javadocs对零参数构造函数的话来说:
分配Date对象和初始化它,使它表示分配它的时间,测量到最近的毫秒。
确保你使用的是java.util.Date而不是java.sql.Date——后者没有零参数构造函数,并且有一些不同的语义,这是一个完全不同的话题。:)
java.util.Date
java.sql.Date
import java.util.Date; Date now = new Date();
注意,日期对象是可变的,如果你想做任何复杂的事情,请使用jodatime。
如果你创建了一个新的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.now()
DateTime dt = DateTime.now();
java.lang.System.currentTimeMillis();将返回自epoch以来的datetime
java.lang.System.currentTimeMillis();
import org.joda.time.DateTime; DateTime now = DateTime.now();
在Java 8中,它是:
ZonedDateTime dateTime = ZonedDateTime.now();
Instant.now()
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时区完成后端工作(业务逻辑、数据库、存储、数据交换)的习惯。上面的代码隐式地依赖于JVM当前的默认时区。
Instant类表示UTC时间轴上的一个时刻,分辨率为纳秒。
Instant
Instant instant = Instant.now();
Instant类是java中的一个基本构建块类。时间和可能经常在代码中使用。
当你需要更灵活的格式时,转换成OffsetDateTime。指定一个ZoneOffset对象。对于UTC,使用方便的协调世界时常数。
OffsetDateTime
ZoneOffset
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
您可以轻松地调整到另一个时区,以便向用户显示。使用正确的时区名称, 从来没有 3-4个字母代码,如EST或IST。
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 );
或者,为了保持UTC,使用Instant。Instant对象表示时间轴上的时刻,以纳秒分辨率表示,始终以UTC为单位。这为分区日期-时间以及时区分配提供了构建块。你可以这样理解:
__abc3 = __abc4 + __abc5
你可以从ZonedDateTime中提取Instant。
Instant instantNow = zdt.toInstant();
你可以从速溶开始。这里不需要指定时区,因为Instant始终是UTC。
Instant now = Instant.now();
Java对日期和时间用例的支持一直不够。例如,现有的类(如java.util.Date和SimpleDateFormatter)不是线程安全的,这可能导致并发性问题。API也有一定的缺陷。例如,java.util.Date中的年从1900开始,月从1开始,日从0开始——这不是很直观。这些问题导致了第三方日期和时间库的流行,比如Joda-Time。为了解决这个问题,为Java SE 8设计了一个新的日期和时间API。
SimpleDateFormatter
Joda-Time
LocalDateTime timePoint = LocalDateTime.now(); System.out.println(timePoint);
根据医生:
now()方法使用系统返回当前日期-时间 时钟和默认时区,不是空。它得到电流 来自默认时区中的系统时钟的日期-时间。这将 在默认时区查询系统时钟,获取当前时间 日期-时间。使用这种方法将阻止使用的能力 测试的备用时钟,因为时钟是硬编码的
now()