有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

爪哇公历日期至今

这应该很简单

customerSearch.get("DateOfBirth")其中customerSearch是一个HashMap<String, Object>并且是一个公历日期

但我需要一个普通的Date对象

我试过了

Date dateOfBirth = new Date(
        ((GregorianCalendar) customerSearch.get("DateOfBirth")).getTimeInMillis());

但公历日期不能定为现在

有什么帮助吗


共 (2) 个答案

  1. # 1 楼答案

    没有java类GregorianDate。除非是你自己的课,如果是的话,你没有提到。那么,为了以防万一,公历只是一个常规的Date,因为当今世界上大多数人都使用公历?那么,地图在^{中包含哪些类的实例呢?如果它只是一个普通的Date,那么您的代码应该是:

    Date dateOfBirth = (Date)(customerSearch.get("DateOfBirth"));
    
  2. # 2 楼答案

    tl;博士

    ( (GregorianCalendar) customerSearch.get( "DateOfBirth" ) )  // Retrieve and cast object of legacy class `GregorianCalendar`.
    .toZonedDateTime()                                           // Convert from terrible legacy class to modern *java.time* class.
    .toLocalDate()                                               // Extract the date-only portion, omitting time-of-day and time zone.
    

    爪哇。时间

    您正在使用甚至可能滥用多年前被java取代的糟糕的日期时间类。JSR 310定义的时间

    • ZonedDateTime取代GregorianCalendar
    • Instant取代java.util.Date
    • LocalDate取代java.sql.Date

    如果您必须与尚未更新为java的旧代码进行互操作。时间,你可以来回转换。调用添加到旧类中的新转换方法

    GregorianCalendar gc = customerSearch… ;
    ZonedDateTime zdt = gt.toZonedDateTime() ;
    

    如果只需要不带时间和时区的日期,请提取LocalDate

    LocalDate dateOfBirth = zdt.toLocalDate() ;
    

    如果你所说的Date是指java.sql.Date类,那么应该使用上面的行,而不是使用LocalDate

    如果你说的Date是指java.util.Date,那么在那里使用这个类是错误的。该课程代表UTC的一个时刻。通过将GregorianCalendar/ZonedDateTime中的分区时刻调整为UTC,可以更改日期

    转换

    如果您需要一个java.util.Date对象来与尚未为java更新的旧代码进行互操作。时间,你可以转换。Ajava.util.Date代表UTC中的一个时刻,因此我们需要java中的等效值。时间Instant,也是UTC中的一个时刻,但分辨率更高,为纳秒,而不是毫秒

    我们可以从上面看到的ZonedDateTime中提取一个Instant。实际上,这只是从分区值调整为UTC值。同一时刻,时间线上的同一点,不同的挂钟时间

    Instant instant = zdt.toInstant() ;  // Extract a `Instant`, adjusting from zone to UTC.
    

    在旧类上使用新的转换方法

    java.util.Date myJavaUtilDate = java.util.Date.from( instant ) ;  // Beware of possible data-loss in the fractional second, truncating from nanos to millis.
    

    如果你需要走另一条路,从传统走向现代

    Instant instant = myJavaUtilDate.toInstant() ;
    

    使用合适的类型

    如果你试图表示一个出生日期,通常是这样做的,只有一个没有时间和区域的日期,那么在你的地图中使用LocalDate。类GregorianCalendarjava.util.DateZonedDateTime都代表一个时刻,时间线上的一个特定点。它们不应该只用于约会

    java.sql.Date假装只是一个日期,但通过一个糟糕的设计决策,作为java.util.Date的子类,它确实包含一天中的某个时间和偏移/区域。如上所述,这个类已被LocalDate取代

    normal Date object

    关于java.util.Datejava.sql.Date没有什么比任何其他日期时间类更“正常”的了

    • java.util.Date代表UTC中的一个时刻,总是UTC,不管它设计得多么糟糕toString的方法告诉你什么(一个谎言)。如果需要UTC时间,请使用java.time.Instant
    • java.sql.Date仅表示日期,但正如所讨论的,实际上在内部包含一个时间和区域/偏移量。用java.time.LocalDate代替表示日期而不是时刻
    • GregorianCalendar代表一个特定地区(时区)的人们使用的挂钟时间。为此,请使用ZonedDateTime
    • java.sql.Timestamp代表UTC中的一个时刻,但分辨率更高,为纳秒,而不是毫秒。java中所有与瞬间相关的类。时间使用纳秒的分辨率。因此,在UTC中,如果分辨率为UTC,请使用java.time.Instant而不是Timestamp

    从JDBC 4.2开始,我们可以直接交换java。有数据库的时间课程。因此,在数据库工作中,无需再次触摸java.sql.Datejava.sql.Timestamp


    关于java。时间

    java.time框架内置于Java8及更高版本中。这些类取代了麻烦的legacy日期时间类,如^{}^{}、&^{}

    目前位于maintenance modeJoda-Time项目建议迁移到java.time

    要了解更多信息,请参阅Oracle Tutorial。并在Stack Overflow中搜索许多示例和解释。规范是JSR 310

    你可以交换java。时间对象直接与数据库连接。使用符合JDBC 4.2或更高版本的JDBC driver。不需要字符串,也不需要java.sql.*

    去哪里获取java。时间课

    ThreeTen-Extra项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如^{}^{}^{}more