相当于C#的DateTime.Now在Java中?

时间:2010-01-06 00:54:58

标签: java datetime

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

在C#中,它是DateTime.Now

10 个答案:

答案 0 :(得分:411)

只需构造一个没有任何参数的新Date对象;这会将当前日期和时间分配给新对象。

import java.util.Date;

Date d = new Date();

the Javadocs代表the zero-argument constructor

  

分配一个Date对象,然后对其进行初始化,使其表示分配的时间,测量精确到毫秒。

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

答案 1 :(得分:58)

许多人认为Java DateCalendar类的设计很差。您应该查看Joda Time,这是一个通常用来代替Java内置日期库的库。

Joda Time中的DateTime.Now相当于:

DateTime dt = new DateTime();

<强>更新

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

DateTime dt = DateTime.now();

答案 2 :(得分:33)

TL;博士

Instant.now()

java.time

java.util.Date类已经被Java 8及更高版本中的新java.time packageTutorial)所取代。旧的java.util.Date/.Calendar类是出了名的麻烦,令人困惑和有缺陷的。避免它们。

ZonedDateTime

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

ZonedDateTime now = ZonedDateTime.now();

A ZonedDateTime封装:

  • 日期。
  • 时间,只有一秒到nanosecond分辨率。
  • 时区。

如果未指定时区,则会以静默方式分配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个字母代码,例如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。这为分区日期时间提供了构建块,并提供了时区分配。你可以用这种方式从概念上考虑它:

  

ZonedDateTime = Instant + ZoneId

您可以从Instant中提取ZonedDateTime

Instant instantNow = zdt.toInstant();

你可以从一个瞬发开始。此处无需指定时区,因为Instant始终为UTC。

Instant now = Instant.now();

答案 3 :(得分:16)

我更喜欢使用Calendar对象。

Calendar now = GregorianCalendar.getInstance()

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

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

答案 4 :(得分:14)

在Java 8中:

ZonedDateTime dateTime = ZonedDateTime.now();

答案 5 :(得分:12)

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

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

答案 6 :(得分:10)

java.lang.System.currentTimeMillis();将返回自纪元以来的日期时间

答案 7 :(得分:6)

import org.joda.time.DateTime;

DateTime now = DateTime.now();

答案 8 :(得分:5)

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

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

答案 9 :(得分:3)

Java一直对日期和时间用例的支持不足。例如,现有的类(例如java.util.DateSimpleDateFormatter)不是线程安全的,这可能导致并发问题。 API中也存在一些缺陷。例如,java.util.Date中的年份从1900开始,月份从1开始,数天从0开始 - 不太直观。这些问题导致了第三方日期和时间库的普及,例如Joda-Time。为了解决新的日期和时间,API是为Java SE 8设计的。

LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);

根据doc

  

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