如何在java中表示日期

nan*_*dor 2 java calendar date

我想要一个简单的 Date 类,它具有月、年和日属性。

我希望将 Date 对象包含在 Magazine 对象中,以便我可以知道 Magazine 的发布时间。

当我尝试使用 Date 类中的 Date 对象时,如下所示 Date d1 = new Date (1,1,1); 从新日期开始的日期是删除线,表明它已被弃用。我阅读了有关替换它的新构造函数的信息,但它看起来非常混乱。我不明白如何使用 Calendar 类完成此操作。如果可能,我不想创建自己的 Date 类...请帮助我。谢谢

Bas*_*que 6

tl;博士

我希望将 Date 对象包含在 Magazine 对象中,以便我可以知道 Magazine 的发布时间。

所以添加一个类型为 的成员变量java.time.LocalDate

package work.basil.example;

import java.time.LocalDate;

public class Magazine
{
    // Member variables.
    public LocalDate published ;

    // Constructor.
    public Magazine ( LocalDate published )
    {
        this.published = published;
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用它:

Magazine m = new Magazine( LocalDate.of( 2019 , Month.JANUARY , 23 ) ) ;
Run Code Online (Sandbox Code Playgroud)

LocalDate

  • 现代方法使用LocalDate.
  • 永远不要使用java.util.Datejava.sql.Date

LocalDate级表示没有时间的天,没有一个日期,只值时区偏移从-UTC

时区对于确定日期至关重要。对于任何给定时刻,日期因地区而异。例如,在法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天” 。

如果未指定时区,JVM 会隐式应用其当前默认时区。该默认值可能会在运行时随时更改(!),因此您的结果可能会有所不同。最好将您想要/预期的时区明确指定为参数。如果关键,请与您的用户确认该区域。

以、、 或等格式指定正确的时区名称。永远不要使用 2-4 个字母的缩写,例如或因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。Continent/RegionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;
Run Code Online (Sandbox Code Playgroud)

如果您想使用 JVM 的当前默认时区,请询问它并作为参数传递。如果省略,代码读起来会变得模棱两可,因为我们不确定您是否打算使用默认值,或者您是否像许多程序员一样没有意识到这个问题。

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.
Run Code Online (Sandbox Code Playgroud)

或指定日期。您可以通过数字设置月份,对于 1 月至 12 月,合理编号为 1-12。

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
Run Code Online (Sandbox Code Playgroud)

或者,更好的是使用Month预定义的枚举对象,一年中的每个月一个。提示:Month在整个代码库中使用这些对象而不仅仅是整数,以使您的代码更具自文档性、确保有效值并提供类型安全。同上Year& YearMonth

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
Run Code Online (Sandbox Code Playgroud)

Java 日期时间类型表,现代和传统。


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

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

现在处于维护模式Joda-Time项目建议迁移到java.time类。

您可以直接与您的数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多