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)
切勿使用java.util.Date类。
请改用java.time。
\n\nLocalDate.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.\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n2018-06-03
\n
\n\n\n获取一个代表明天的新 Date 实例,它没有时间成分(只有年、月和日)。
\n
您正在使用日期与时间类来表示仅日期值。方钉,圆孔。
\n\n相反,使用仅日期类:LocalDate。
您正在使用可怕的旧日期时间类,这些类在几年前已被行业领先的java.time类取代。
\n\n\n\n\n我正在尝试获取当前日期(现在)
\n
通过调用 获取当前日期LocalDate.now。
LocalDate today = LocalDate.now() ;\nRun 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
ZoneId z = ZoneId.of( "America/Montreal" ) ; \nLocalDate today = LocalDate.now( z ) ;\nRun Code Online (Sandbox Code Playgroud)\n\n如果您想使用 JVM\xe2\x80\x99s 当前默认时区,请询问它并作为参数传递。如果省略,则隐式应用 JVM\xe2\x80\x99s 当前默认值。最好明确一点,因为默认值可能会在运行时的任何时刻被 JVM 内任何应用程序的任何线程中的任何代码更改。
\n\nLocalDate today = LocalDate.now( ZoneId.systemDefault() ) ; \nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n添加一天
\n
简单的。调用LocalDate::plusDays方法。java.time类使用不可变对象模式。因此,不是修改 (\xe2\x80\x9cmutate\xe2\x80\x9d) 原始对象,而是生成一个新的对象。
LocalDate tomorrow = today.plusDays( 1 ) ;\nRun Code Online (Sandbox Code Playgroud)\n\n在某些情况下,您可能希望表示添加为对象本身的时间量。使用Period数年、数月、数天。
Period p = Period.ofDays( 1 ) ;\nLocalDate localDate = today.plus( p ) ;\nRun Code Online (Sandbox Code Playgroud)\n\n要生成String表示 our 值的LocalDate,请调用toString(如果您需要标准ISO 8601格式)。标准格式似乎就是您想要的。
String output = tomorrow.toString() ; // Generate String in standard ISO 8601 format, YYYY-MM-DD.\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n2018-01-23
\n
您可以使用 指定自定义格式模式DateTimeFormatter。或者,更好的是,让同一个类使用其ofLocalized\xe2\x80\xa6方法自动为您本地化。
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat。
Joda -Time项目现在处于维护模式,建议迁移到java.time类。
\n\n要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
\n\n您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*
从哪里获取 java.time 类?
\n\nThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval、、、等等。YearWeekYearQuarter
| 归档时间: |
|
| 查看次数: |
5306 次 |
| 最近记录: |