oby*_*by1 39 java date jodatime
LocalDate#toDateMidnight读取的javdoc 如下:
从v1.5开始,建议您避免使用DateMidnight并使用toDateTimeAtStartOfDay(),因为下面有详细说明.
如果默认时区在午夜切换到夏令时,则此方法将引发异常,此LocalDate表示该切换日期.问题是在所需的日期没有午夜这样的时间,因此抛出了这样的例外.
在某些时区中不存在午夜这一事实似乎足以避免DateMidnight完全使用(假设您的代码没有使用已知不具有此DST情况的固定时区,并且永远不需要在其中使用不同的时区未来).
但是,DateMidnight不会弃用,并且DateMidnight类本身的javadoc中没有类似的建议或警告.此外,DateMidnight构造函数愉快地接受即时和时区,使得在给定的一天不存在午夜,而不是投掷IllegalArgumentException类似的LocalDate#toDateMidnight.结果DateMidnight表现为DateTime在一天开始时的时间.
当某个特定日期不存在午夜时,为什么LocalDate#toDateMidnight在DateMidnight构造函数没有的情况下抛出异常?推荐的用例是DateMidnight什么?
Jod*_*hen 45
没有充分的理由使用DateMidnight.LocalDate是更好的选择.这是因为午夜不会在某些时区发生一次,完全搞乱了班级的可用性,并在应用程序中制造错误.
修复了构造函数以避免最严重的问题,但是看到DateMidnight内部毫秒值指向01:00的对象并不是很好.
或者更好地直接使用该LocalDate方法toDateTimeAtStartOfDay来绕过DateTime对象的创建(与上面的答案相关).
new LocalDate().toDateTimeAtStartOfDay( myDateTimeZone )
Run Code Online (Sandbox Code Playgroud)
具体使用java.time类LocalDate::atStartOfDay是不要使用 \xe2\x80\x9cmidnight\xe2\x80\x9d 的狡猾想法。
ZoneId z = ZoneId.of( "America/Montreal" ); // A time zone.\nZonedDateTime todayStart = LocalDate.now( z ).atStartOfDay( z ); // Produces a LocalDate (a whole day without time zone), then transforms into a `ZonedDateTime` (a moment on the timeline)\nRun Code Online (Sandbox Code Playgroud)\n\n由于 Joda-Time 项目现在处于维护模式,并且团队建议迁移到 java.time 类,因此我将添加使用 java.time 的示例。
\n\n如果您想将一整天表示为一个整体,请使用该类LocalDate。这LocalDate表示仅日期值,没有时间和时区。
时区对于确定日期至关重要。对于任何特定时刻,全球各地的日期都会因地区而异。例如,法国巴黎午夜过后几分钟是新的一天,而Montr\xc3\xa9al Qu\xc3\xa9bec中仍然是 \xe2\x80\x9cyesterday\xe2\x80\x9d中仍然是 \xe2\x80\x9cyesterday\xe2\x80\x9d 。
\n\nZoneId z = ZoneId.of( \xe2\x80\x9cAmerica/Montreal\xe2\x80\x9d );\nLocalDate today = LocalDate.now( z );\nRun Code Online (Sandbox Code Playgroud)\n\n正如本页所讨论的,试图确定一天的结束是不好的做法。一方面,一天的最后一秒你会遇到一个无限可除分数的问题。您是否决定使用毫秒、微秒、纳秒或其他单位,因为所有这些都是常用的?而是利用新一天的第一时刻。
\n\n让 java.time 确定一天中第一时刻的挂钟时间。不要假设时间会出现00:00:00异常,例如夏令时 (DST) 可能意味着第一个时刻是诸如 的时间01:00:00。目前,此类 DST 调整已在多个国家/地区的时区中使用。
因此,要在一天的开始时获得一点时间,即时间线上的实际点,请致电LocalDate::atStartOfDay。请注意,这是比 Joda-Time\xe2\x80\x99s 方法中使用的方法名称更短的版本withTimeAtStartOfDay。在 a 中指定所需/预期的时区ZoneId以生成ZonedDateTime对象。
ZoneId z = ZoneId.of( "America/Montreal" );\nZonedDateTime zdt = today.atStartOfDay( z );\nRun Code Online (Sandbox Code Playgroud)\n\n那么如何表示一个时间跨度呢?如果我想确定这一天的开始和结束,我该如何做到这一点,同时遵循此建议?日期时间工作中常用的解决方案是半开放方法。在这种方法中,跨度的开头是包含的,而结尾是排除的。因此 \xe2\x80\x9ctoday\xe2\x80\x9d 表示从一天的第一时刻开始,一直运行到(但不包括)第二天的第一时刻。
\n\nZonedDateTime zdtStartToday = LocalDate.now( z ).atStartOfDay( z );\nZonedDateTime zdtStartTomorrow = zdtStartToday.plusDays( 1 );\nRun Code Online (Sandbox Code Playgroud)\n\n顺便说一句,ThreeTen-Extra项目有一个方便的Interval这种时间跨度的方便类。
Interval todayInterval = Interval.of( \n zdtStartToday.toInstant() ,\n zdtStartTomorrow.toInstant()\n )\nRun Code Online (Sandbox Code Playgroud)\n\njava.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
| 归档时间: |
|
| 查看次数: |
23321 次 |
| 最近记录: |