【发布时间】:2011-04-29 16:52:36
【问题描述】:
在 Java Date 类中是否有 DateTime.MinValue 和 DateTime.Today 的 Java 等效项?或者实现类似目标的方法?
我已经意识到您对 .NET 日期时间类有多么宠爱,我还需要 AddDays()、AddMonths() 的等价物。
【问题讨论】:
在 Java Date 类中是否有 DateTime.MinValue 和 DateTime.Today 的 Java 等效项?或者实现类似目标的方法?
我已经意识到您对 .NET 日期时间类有多么宠爱,我还需要 AddDays()、AddMonths() 的等价物。
【问题讨论】:
事实上的 Java 日期时间 API 是 joda-time。
有了它,你只需构造new DateTime()就可以得到当前的日期/时间。
同样,没有它,您可以使用Calendar.getInstance() 或new Date() 获取当前日期/时间。
MinValue 可以是Calendar.getInstance(0) / new Date(0)。这将使用默认年表 - 即自 1970 年 1 月 1 日以来。由于 MinValue 返回第一年的一月 1 日,您可以使用 DateTime 的适当构造函数简单地指定此日期。
【讨论】:
现在应该使用 Calendar 对象来完成大多数日期操作。
http://download.oracle.com/javase/6/docs/api/java/util/Calendar.html
【讨论】:
获取当前日期:
日历日历 = Calendar.getInstance(); SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
try {
System.out.println("Today: " + dateFormat.format(calendar.getTime()));
} catch (Exception e) {
e.printStackTrace();
}
【讨论】:
+--------------------+----------------------------------------+----------------------------+
| .NET DateTime (C#) | Joda DateTime (Java) [See Note #2] | Java Date |
+--------------------+----------------------------------------+----------------------------+
| | | |
| DateTime.MinValue | new DateTime(Long.MIN_VALUE) | new Date(Long.MIN_VALUE) |
| | | [See Note #3] |
| | | |
| DateTime.Today | new DateTime().withTimeAtStartOfDay() | Messy [See Note #4] |
| | | |
| DateTime.Now | new DateTime() | new Date() |
| | | |
| DateTime.MaxValue | new DateTime(Long.MAX_VALUE) | new Date(Long.MAX_VALUE) |
| | | |
+--------------------+----------------------------------------+----------------------------+
补充说明:
new Date(Long.MIN_VALUE)
【讨论】:
其他答案可能是正确的,但使用过时的类。
旧的日期时间类(java.util.Date/.Calendar 等)被 Joda-Time 取代,而 java.time 又被 Java 8 及更高版本中内置的框架所取代。 java.time 类的灵感来自Joda-Time,由JSR 310 定义,由 ThreeTen-Extra 项目扩展,由ThreeTen-Backport 项目向后移植到Java 6 和7,并在ThreeTenABP 中适应Android项目。见Tutorial。
要在UTC 中以nanoseconds 的分辨率获取时间轴上的当前时刻,请使用Instant。
Instant now = Instant.now();
Instant 有三个常量:
EPOCH – 1970-01-01T00:00:00Z
MIN – -1000000000-01-01T00:00Z
MAX – 1000000000-12-31T23:59:59.999999999Z
要获取offset-from-UTC 的当前时刻,请应用ZoneOffset 以获取OffsetDateTime。
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.of( "-04:00" ) );
如果已知,最好应用full time zone(偏移量加上夏令时等异常规则)。申请ZoneId 以获得ZonedDateTime。
ZonedDateTime now = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
你可以进行算术运算。
ZonedDateTime dayLater = now.plusDays( 1 );
ZonedDateTime monthLater = now.plusMonths( 1 );
您可以获得一天的第一刻。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime tomorrowStart = now.toLocalDate().atStartOfDay( zoneId ); // Usually time-of-day of `00:00:00.0` but not always.
如果您只需要没有时间和时区的日期,请使用LocalDate。类似地,LocalTime 仅用于不带日期和不带时区的时间。通常最好坚持使用Instant 和OffsetDateTime/ZonedDateTime,因为Local… 类型不代表时间线上的实际时刻(没有偏移或时区意味着它们是未定义的)。
LocalDate localDate = LocalDate.now( zoneId );
LocalTime localTime = LocalTime.now( zoneId );
【讨论】: