Java中与.NET DateTime.MinValue和DateTime.Today相对应的是什么?

21

Java的Date类中是否有与DateTime.MinValue和DateTime.Today相当的函数?或者有没有一种实现类似功能的方法?

我意识到使用.NET datetime类非常方便,我还需要AddDays(),AddMonths()等类似的函数。


6个回答

23

事实上,Java日期时间API的标准是joda-time

使用它,您可以通过构造new DateTime()来获取当前日期/时间。

同样地,如果没有它,您可以使用Calendar.getInstance()new Date()来获得当前日期/时间。

MinValue可以是Calendar.getInstance(0)/ new Date(0)。这将使用默认年表 - 即自1970年1月1日以来。由于MinValue返回的是公元1年1月1日,您可以通过使用DateTime的适当构造函数来简单地指定此日期。


Java内置的日期处理功能不够好。花上额外的3秒钟来使用Joda时间库,你会感到更加愉快。 - bwawok
我听说过Jon Skeet的API,但这个API是否适用于Android呢? - Chris S
我相信它完全适用于Android。(Jon Skeet已经将JodaTime移植到了.NET (noda-time)) - Bozho
我可以使用纪元作为最小值(我正在寻找一些指示尚未设置日期的东西),但对于相反的情况,我不太确定。 - Chris S
对于未设置日期,您可以使用“null”日期。这意味着您需要更多地进行空值检查,但是与一些随机日期(例如公元前764年)相比,“null”更能描述未设置日期的情况。 - bwawok
显示剩余2条评论

4
其他答案可能是正确的,但使用过时的类。

java.time

旧的日期时间类(java.util.Date/.Calendar等)已被Joda-Time取代,而后者又被内置于Java 8及更高版本的java.time框架所取代。java.time类受到Joda-Time的启发,由JSR 310定义,由ThreeTen-Extra项目扩展,由ThreeTen-Backport项目移植到Java 6和7,并在ThreeTenABP项目中适配Android。请参阅Tutorial

使用Instant,可在UTC纳秒为分辨率获取当前时间线上的时刻。
Instant now = Instant.now();

Instant 有三个常量:

  • EPOCH1970-01-01T00:00:00Z
  • MIN-1000000000-01-01T00:00Z
  • MAX1000000000-12-31T23:59:59.999999999Z
要获取一个相对于UTC的偏移量的当前时间,应用ZoneOffset以获取一个OffsetDateTime
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.of( "-04:00" ) );

最好使用已知的完整时区(偏移量加上诸如夏令时之类的异常规则)。应用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表示仅包含时间而不包含日期和时区。通常最好坚持使用InstantOffsetDateTime/ZonedDateTime,因为Local…类型不代表时间轴上的实际时刻(没有偏移或时区意味着它们是未定义的)。
LocalDate localDate = LocalDate.now( zoneId );
LocalTime localTime = LocalTime.now( zoneId );

第一个问题在这里仍然没有得到答复。 - lrkwz

3
.NET和Java中日期/时间特性的比较
.NET DateTime (C#) Joda DateTime (Java, deprecated) [See Note #2] Java Date
DateTime.MinValue new DateTime(Long.MIN_VALUE) new Date(Long.MIN_VALUE) [查看注释#3]
DateTime.Today new DateTime().withTimeAtStartOfDay() 混乱 [查看注释#4]
DateTime.Now new DateTime() new Date()
DateTime.MaxValue new DateTime(Long.MAX_VALUE) new Date(Long.MAX_VALUE)

附加说明:

  1. 处理日期和时间很麻烦。这个表格旨在作为代码迁移的起点。比较的是概念,而不是确切的值(例如.NET的最小日期/时间与Java的不同)。
  2. Joda DateTime 是Java首选的日期/时间库。
  3. 有关Java中 new Date(Long.MIN_VALUE) 的更多信息,请参见其他注意事项
  4. 使用Java的Date获取一天的开始需要更多的操作-请参见此处
  5. .NET的DateTimes默认为本地日期/时间,而在Java中默认为UTC。在处理日期和时间时,请务必考虑任何时区的影响

Joda-Time已弃用

Joda-Time已经被弃用。从他们的网站档案上可以看到:

请注意,从Java SE 8开始,用户被要求迁移到java.time(JSR-310)——JDK的核心部分,取代了这个项目。

意味着java.util.Dateorg.joda.time.DateTimejava.time.ZonedDateTime 给我们带来新的映射:
.NET DateTime (C#) java.time (以前称为 Joda-Time) Java Date
DateTime.MinValue LocalDateTime.MIN new Date(Long.MIN_VALUE)
DateTime.Today LocalDateTime.of(LocalDate.NOW, LocalTime.MIDNIGHT) (不可用)
DateTime.Now LocalDateTime.now() new Date()
DateTime.UtcNow LocalDateTime.now(ZoneOffset.UTC) (不可用)
DateTime.MaxValue LocalDateTime.MAX new Date(Long.MAX_VALUE)

.NET的DateTime包含:

  • 日期
  • 时间
  • 并没有关于它包含哪个时区的特定信息(除了“本地”、“UTC”或“未指定”)。

这意味着java.time的等效对象是LocalDateTime。如果您想要一个还带有与UTC偏移量相关信息的日期时间对象:

  • .NET: DateTimeOffset
  • java.time: ZonedDateTime

-2

获取当前日期:

Calendar calendar = Calendar.getInstance(); SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

    try {

        System.out.println("Today: " + dateFormat.format(calendar.getTime()));

    } catch (Exception e) {
        e.printStackTrace();
    }

-2

2
这并没有回答他的问题。 - Bozho
@Bozho,正如Chris所理解的那样,我试图为他指出使用Java核心进行日期操作的正确方向。 - Kevin D
我不认为这是Bozho,我读过你的足够多的答案,你给我的印象并不那么小气。我承认这个答案可以有更多的细节,但我真的没有时间了。 - Kevin D


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接