Java 8 添加没有时间段的日期

hot*_*oup 5 calendar date java-8

Java 8 在这里。我正在尝试获取当前Date(现在),为其添加一天,并获得一个Date代表明天的新实例,该实例没有时间组件(只有年、月和日)。我最好的尝试:

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, 1);

Date tomorrow = calendar.getTime();
Run Code Online (Sandbox Code Playgroud)

但是当我打印时tomorrow,它包含一个时间组件(例如Sat Jun 02 14:04:59 EDT 2018:),而我只希望它包含小时/月/分钟/等的归零值(所以:)Sat Jun 02 00:00:00 EDT 2018。我怎样才能做到这一点?归根结底,我只想要一个Date代表明天日期的实例,所以在伪代码中:

Date now = new Date();  // 2018-06-01
Date tomorrow = now.plus(1, DAY); // 2018-06-02
Run Code Online (Sandbox Code Playgroud)

Loc*_*Loc 10

Calendar.getInstance() 返回一个包含时间组件的 Calendar 实例,因此您需要从 Calendar 实例中清除时间组件。

这是正确的代码:

    // today
    Calendar calendar = Calendar.getInstance();
    // Add 1 day -> tomorrow
    calendar.add(Calendar.DAY_OF_YEAR, 1);
    
    // Clear time components
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    // Util date tomorrow
    Date tomorrow = calendar.getTime();
Run Code Online (Sandbox Code Playgroud)

注意:您没有使用 Java 8 日期/时间 API。如果您使用 Java 8+,以下是方法

    // java 8+ Date/time API
    LocalDate today = LocalDate.now();

    LocalDate tomorrow = today.plusDays(1);

    // Java8+ tomorrow to Util tomorrow if you want
    java.util.Date tomorrowUtilDate = java.sql.Date.valueOf(tomorrow);
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

太长了;博士

\n\n

切勿使用java.util.Date类。

\n\n

请改用java.time

\n\n
LocalDate.now()           // Capture the current date as seen in the wall-clock time of the JVM\xe2\x80\x99s current default time zone.\n         .plusDays( 1 )   // Move to tomorrow\xe2\x80\x99s date. Returns a fresh `LocalDate` object rather than modifying (\xe2\x80\x9cmutating\xe2\x80\x9d) the original, per immutable objects pattern.\n         .toString()      // Generate a String representing this date value. Use standard ISO 8601 format: YYYY-MM-DD.\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

2018-06-03

\n
\n\n

类型错误

\n\n
\n

获取一个代表明天的新 Date 实例,它没有时间成分(只有年、月和日)。

\n
\n\n

您正在使用日期与时间类来表示仅日期值。方钉,圆孔。

\n\n

相反,使用仅日期类:LocalDate

\n\n

避免遗留类

\n\n

您正在使用可怕的旧日期时间类,这些类在几年前已被行业领先的java.time类取代。

\n\n
\n

我正在尝试获取当前日期(现在)

\n
\n\n

通过调用 获取当前日期LocalDate.now

\n\n
LocalDate today = LocalDate.now() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

该调用隐式应用您的 JVM\xe2\x80\x99s 当前默认时区来确定当前日期。时区对于确定日期至关重要。对于任何特定时刻,全球各地的日期都会因地区而异。例如,法国巴黎午夜过后几分钟是新的一天,而Montr\xc3\xa9al Qu\xc3\xa9bec中仍然是 \xe2\x80\x9cyesterday\xe2\x80\x9d 。

\n\n

如果未指定时区,JVM 会隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好明确指定您想要/预期的时区作为参数。

\n\n

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

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

如果您想使用 JVM\xe2\x80\x99s 当前默认时区,请询问它并作为参数传递。如果省略,则隐式应用 JVM\xe2\x80\x99s 当前默认值。最好明确一点,因为默认值可能会在运行时的任何时刻被 JVM 内任何应用程序的任何线程中的任何代码更改。

\n\n
LocalDate today = LocalDate.now( ZoneId.systemDefault() ) ; \n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

添加一天

\n
\n\n

简单的。调用LocalDate::plusDays方法。java.time类使用不可变对象模式。因此,不是修改 (\xe2\x80\x9cmutate\xe2\x80\x9d) 原始对象,而是生成一个新的对象。

\n\n
LocalDate tomorrow = today.plusDays( 1 ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

在某些情况下,您可能希望表示添加为对象本身的时间量。使用Period数年、数月、数天。

\n\n
Period p = Period.ofDays( 1 ) ;\nLocalDate localDate = today.plus( p ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

弦乐

\n\n

要生成String表示 our 值的LocalDate,请调用toString(如果您需要标准ISO 8601格式)。标准格式似乎就是您想要的。

\n\n
String output = tomorrow.toString() ;  // Generate String in standard ISO 8601 format, YYYY-MM-DD.\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

2018-01-23

\n
\n\n

您可以使用 指定自定义格式模式DateTimeFormatter。或者,更好的是,让同一个类使用其ofLocalized\xe2\x80\xa6方法自动为您本地化。

\n\n
\n\n

关于java.time

\n\n

java.time框架内置于 Java 8 及更高版本中这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

\n\n

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

\n\n

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

\n\n

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

\n\n

从哪里获取 java.time 类?

\n\n\n\n

ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval、、、等等。YearWeekYearQuarter

\n