在Java中等价于C#的DateTime.Now?
如何在Java中获取当前date?
在C#中是DateTime.Now
。
只需构造一个没有任何参数的新的Date
对象; 这会将当前的date和时间分配给新的对象。
import java.util.Date; Date d = new Date();
用Javadocs 的零参数构造函数的话来说 :
分配一个Date对象并对其进行初始化,以便它表示分配的时间 ,精确到毫秒。
确保你使用的是java.util.Date
而不是java.sql.Date
– 后者没有一个零参数的构造函数,并且有一些不同的语义,这是完全不同的对话的主题。 🙂
Java date和日历类被许多人认为是devise不佳。 你应该看看Joda Time ,一个通常用来代替Java内置date库的库。
Joda Time中的DateTime.Now
相当于:
DateTime dt = new DateTime();
更新
正如评论中所述,最新版本的Joda Time有一个DateTime.now()
方法,所以:
DateTime dt = DateTime.now();
TL;博士
Instant.now()
java.time
java.util.Date类已经在Java 8及更高版本中被新的java.time包 ( Tutorial )所取代 。 旧的java.util.Date/.Calendar类是非常麻烦,混乱和有缺陷的。 避免他们。
ZonedDateTime
在java.time中获取当前时刻。
ZonedDateTime now = ZonedDateTime.now();
ZonedDateTime
封装了:
- date。
- 时间,以几分之一秒到纳秒的分辨率。
- 时区。
如果没有指定时区,则您的JVM的当前默认时区将被静默分配。 更好地指定您想要的/预期的时区,而不是隐式地依靠默认值。
ZoneId z = ZoneId.of( "Pacific/Auckland" ); ZonedDateTime zdt = ZonedDateTime.now( z );
世界标准时间
一般来说,更好的做法是在UTC时区内完成后端工作(业务逻辑,数据库,存储,数据交换)。 上面的代码隐含地依赖于JVM当前的默认时区。
Instant
类表示UTC时间轴中的某个时刻,分辨率为纳秒。
Instant instant = Instant.now();
Instant
类是java.time中的一个基本构build块类,可以在代码中经常使用。
如果您需要更多的格式化灵活性,请转换为OffsetDateTime
。 指定一个ZoneOffset
对象。 UTC使用方便的常数 。
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
时区
您可以轻松调整到另一个时区,以便呈现给用户。 使用适当的时区名称 , 不要使用诸如EST
或IST
类的3-4字母代码。
ZoneId z = ZoneId.of( "America/Montreal" ); ZonedDateTime nowMontreal = instant.atZone( z );
生成该date时间值的string表示,本地化。
String output = DateTimeFormatter .ofLocalizedDate( FormatStyle.FULL ) .withLocale( Locale.CANADA_FRENCH ) .format ( nowMontreal );
Instant
或者,保持UTC,使用Instant
。 Instant
对象表示时间轴上的一个时刻,以毫微秒的分辨率,始终以UTC表示。 这提供了分区date时间的构build块以及时区分配。 你可以这样概念地思考:
ZonedDateTime
=Instant
+ZoneId
您可以从ZonedDateTime
提取Instant
ZonedDateTime
。
Instant instantNow = zdt.toInstant();
你可以开始一个即时。 无需在此处指定时区,因为Instant
始终采用UTC。
Instant now = Instant.now();
我更喜欢使用日历对象。
Calendar now = GregorianCalendar.getInstance()
我发现使用起来要容易得多。 您还可以从日历中获取Date对象。
http://java.sun.com/javase/6/docs/api/java/util/GregorianCalendar.html
在Java 8中它是:
ZonedDateTime dateTime = ZonedDateTime.now();
import java.util.Date; Date now = new Date();
请注意, Date对象是可变的,如果你想做任何复杂的事情,请使用jodatime 。
java.lang.System.currentTimeMillis();
将返回自时代以来的date
import org.joda.time.DateTime; DateTime now = DateTime.now();
如果您创build一个新的Date对象,默认情况下它将被设置为当前时间:
import java.util.Date; Date now = new Date();
对于date和时间用例,Java一直得不到足够的支持。 例如,现有的类(如java.util.Date
和SimpleDateFormatter
)不是线程安全的,可能会导致并发问题。 API也有一些缺陷。 例如, java.util.Date
年份从1900开始,月份从1开始,并且天从0开始 – 不太直观。 这些问题导致第三方date和时间库的stream行,如Joda-Time
。 解决新的date和时间API是为Java SE 8devise的。
LocalDateTime timePoint = LocalDateTime.now(); System.out.println(timePoint);
根据文档 :
now()
方法使用系统时钟和默认时区返回当前的date时间,而不是null 。 它从默认时区的系统时钟获取当前date时间。 这将在默认时区查询系统时钟以获取当前date时间。 使用这种方法会阻止使用备用时钟进行testing,因为时钟是硬编码的。