【问题标题】:Java equivalent of .NET DateTime.MinValue, DateTime.TodayJava 等效于 .NET DateTime.MinValue、DateTime.Today
【发布时间】:2011-04-29 16:52:36
【问题描述】:

在 Java Date 类中是否有 DateTime.MinValue 和 DateTime.Today 的 Java 等效项?或者实现类似目标的方法?

我已经意识到您对 .NET 日期时间类有多么宠爱,我还需要 AddDays()、AddMonths() 的等价物。

【问题讨论】:

标签: java datetime date


【解决方案1】:

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

有了它,你只需构造new DateTime()就可以得到当前的日期/时间。

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

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

【讨论】:

  • +1。 Java 内置日期很糟糕。多花 3 秒围绕 Joda 时间进行构建,你会更快乐。
  • 我听说过 Jon Skeet 的 api,但这对 android 友好吗?
  • 我相信它完全适合安卓系统。 (Jon Skeet 已将 JodaTime 移植到 .NET(noda-time))
  • 我以为乔达时间不是他的野田时间,我试试看
  • 我可以只使用纪元作为最小值(我正在寻找表明没有设置日期的东西),但我不太确定相反的情况
【解决方案2】:

现在应该使用 Calendar 对象来完成大多数日期操作。

http://download.oracle.com/javase/6/docs/api/java/util/Calendar.html

【讨论】:

  • 这没有回答他的问题。
  • @Bozho,正如 Chris 所理解的那样,我试图为他指出正确的方向,以使用核心 Java 进行日期操作。
  • 我没想到是博卓,你的回答我读的够多了,你不会觉得我那么小气。我承认答案本可以更详细,但我真的没有时间。
【解决方案3】:

获取当前日期:

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

    try {

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

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

【讨论】:

    【解决方案4】:
    【解决方案5】:

    .NET 和 Java 中的日期/时间功能比较

    +--------------------+----------------------------------------+----------------------------+
    | .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)   |
    |                    |                                        |                            |
    +--------------------+----------------------------------------+----------------------------+
    

    补充说明:

    1. 处理日期和时间很麻烦。此表旨在作为代码迁移的起点。比较比较的是概念,而不是确切的值(例如,.NET 的最小日期/时间与 Java 的值不同)
    2. Joda DateTime 是 Java 的首选日期/时间库。
    3. 在 Java 中查看 additional notes 上的 new Date(Long.MIN_VALUE)
    4. 使用 Java 的 Date 开始新的一天有点复杂 - see here
    5. .NET DateTimes 默认为本地日期/时间,而在 Java 中默认为 UTC。在处理日期和时间时,请务必考虑任何 impact of timezones

    【讨论】:

      【解决方案6】:

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

      java.time

      旧的日期时间类(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 有三个常量:

      • EPOCH1970-01-01T00:00:00Z
      • MIN-1000000000-01-01T00:00Z
      • MAX1000000000-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 仅用于不带日期和不带时区的时间。通常最好坚持使用InstantOffsetDateTime/ZonedDateTime,因为Local… 类型不代表时间线上的实际时刻(没有偏移或时区意味着它们是未定义的)。

      LocalDate localDate = LocalDate.now( zoneId );
      LocalTime localTime = LocalTime.now( zoneId );
      

      【讨论】:

      • 第一个问题在这里仍然没有答案
      猜你喜欢
      • 2011-03-23
      • 2012-11-28
      • 2010-11-20
      • 2019-04-15
      • 2011-01-27
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多