当前位置: 首页 > 知识库问答 >
问题:

OffsetDateTime字符串与OffsetDateTime进行比较。java中的now()

汲永嘉
2023-03-14

我对OffsetDateTime的用法非常陌生,我正在尝试将OffsetDateTime字符串与OffsetDateTime进行比较。以这种方式在java中使用now(),

import java.time.OffsetDateTime;

public class OffsetDateTimeDemo {
   public static void main(String[] args) {

      OffsetDateTime one = OffsetDateTime.parse("2017-02-03T12:30:30+01:00");
      System.out.println("First ::" + OffsetDateTime.now().compareTo(one));

      OffsetDateTime date1 = OffsetDateTime.parse("2019-02-14T00:00:00");
      System.out.println("Second ::" +  OffsetDateTime.now().compareTo(date1));

      OffsetDateTime date3 = OffsetDateTime.parse("Mon Jun 18 00:00:00 IST 2012");
      System.out.println(" Third :: " +OffsetDateTime.now().compareTo(date3));


   }
}   

但我正在学习java。时间总体安排所有3种情况下的DateTimeParseException。

然而,如果我将2个OffsetDateTime字符串与CompareTo方法进行比较,它的工作就很好了。

有没有人能在这方面给我一些启示,并好心地指导我克服我的错误。

提前感谢。

共有1个答案

慕容灿
2023-03-14

与编码相比,你的编码会分散注意力。例外情况是将字符串输入解析为对象。

另一个问题:您在第二个和第三个输入上使用了错误的类。

另一个问题是:在调用now()时,您隐含地依赖于JVM的当前默认时区。糟糕的做法是,任何阅读的程序员都不知道您是有意使用默认时区,还是像许多程序员一样不知道这个问题。此外,当前默认时区可以在运行时的任何时刻由JVM中任何应用程序的任何线程中的任何代码更改。所以最好始终明确指定您想要/预期的区域或偏移量。

OffsetDateTime.now( 
    ZoneOffset.UTC
)

或者更好的是,使用ZonedDateTime来捕获比OffsetDateTime更多的信息。

ZonedDateTime.now(
    ZoneId.of( "Pacific/Auckland" )
)

您的第一个字符串输入正确,并且解析成功。

OffsetDateTime.parse( "2017-02-03T12:30:30+01:00" )

全行代码:

OffsetDateTime odt = OffsetDateTime.parse( "2017-02-03T12:30:30+01:00" ) ;

查看此代码在IdeOne上实时运行。通用域名格式。

odt.toString(): 2017-02-03T12:30:30 01:00

要进行比较,请提取即时代码。这样做可以有效地将力矩从某个偏移量调整为零偏移量,或UTC本身。根据定义,瞬时值始终为UTC。

Instant instant = Instant.now() ;                          // Capture the current moment as seen in UTC.
boolean odtIsPast = odt.toInstant().isBefore( instant ) ;

您的第二个字符串输入缺少任何与UTC或时区偏移的指示器。因此,OffsetDateTime是一个错误的类。相反,使用LocalDateTime,它没有任何偏移量或区域的概念。

这意味着LocalDateTime不能代表一个时刻。例如,今年1月23日的中午可能意味着亚洲/东京的中午,这比欧洲/巴黎的中午早几个小时,也可能意味着美国/蒙特利尔的中午晚一个小时。如果没有区域或偏移量的上下文,LocalDateTime就没有真正的意义。因此,将LocalDateTime与当前时刻进行比较是毫无意义的。

LocalDateTime.parse( "2019-02-14T00:00:00" )

查看此代码在IdeOne上实时运行。通用域名格式。

ldt。toString():2019-02-14T00:00

相比之下,你不能-

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;                   // India time.
ZonedDateTime zdt = ldt.atZone( z ) ;
Instant instant = Instant.now() ;                          // Capture the current moment as seen in UTC.
boolean zdtIsPast = zdt.toInstant().isBefore( instant ) ;  // Compare.

顺便说一下,我注意到一天的时间是零。如果您的目标是只表示日期,而不表示一天中的任何时间和任何区域,请使用LocalDate类。

第三个字符串输入带有时区指示器。因此,应该将其解析为分区日期时间(ZonedDateTime)。

不幸的是,您选择了一种糟糕的字符串格式来解析。永远不要使用2-4个字符的伪区域,如IST。它们不是标准化的。它们也不是唯一的!您的IST可能意味着爱尔兰标准时间或印度标准时间或其他时间。

大陆/地区的格式指定适当的时区名称,例如美洲/蒙特利尔非洲/卡萨布兰卡太平洋/奥克兰

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

查看此代码在IdeOne上实时运行。通用域名格式。

zdt.toString(): 2019-02-20T22:34:26.833 01:00[非洲/突尼斯]

您可以尝试解析这个。ZonedDateTime将猜测IST表示哪个区域。但这只是猜测,考虑到固有的模棱两可的输入,这是不可靠的。就个人而言,我会拒绝编码,拒绝将此输入数据返回其来源。

如果您坚持进行这种不可靠的解析尝试,请参阅您最近提出的类似问题的正确答案。

教育您的源代码始终使用标准ISO 8601格式将日期时间值交换为人类可读的文本。

java。默认情况下,时间类在解析/生成字符串时使用这些ISO 8601格式。ZonedDateTime类明智地扩展了标准,将时区的标准名称附加到方括号中。

java.time框架内置于Java8及更高版本中,这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendar

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

现在处于维护模式的Joda Time项目建议迁移到java。时间类。

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

从何处获取java。时间课程?

  • Java SE 8、Java SE 9、Java SE 10、Java SE 11及更高版本—标准Java API的一部分,带有捆绑实现。
    • Java 9添加了一些次要功能和修复
    • 大部分java。时间功能后移植到Java 6
    • java.time类的Android捆绑包实现的最新版本。
    • 对于早期的Android(

    ThreeTen额外项目扩展了java。额外上课的时间。该项目是java未来可能添加内容的试验场。时间您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等。

 类似资料:
  • 我试图将日期字符串解析为,如下所示。 但我有点例外,

  • 我正在将日期/日期时间字符串转换为,我有一种日期时间格式,它可能有以下值之一: 有时有时间和没有时间,我需要将其转换为。 我已经尝试了下面的代码 因为没有时间,我将它设置为默认值,但是当我试图解析时 它抛出的错误类似于 线程"main"java.time.format.DateTimeParseException中的异常:无法解析文本'2016-06-06':无法从TemporalAccess:{

  • 我已经声明了一个实现可比较接口和compareTo方法的类,使用employee ID比较两个员工。创建的类对象插入数组列表。现在,当我使用collections.sort(arrayList对象)时,它工作得很好。我对collective和comparator接口之间的比较有何不同感到困惑。我想知道如何在纯粹由数字组成的employee id字符串和其他字符串employee id之间进行比较,

  • 问题内容: 新手问题,但我有以下代码: 当用户输入“ y”时,我只需要简单地再次打印欢迎消息即可。但这不起作用。有任何想法吗? 问题答案: 在Java中,使用来比较原始类型(int,long,boolean等)的相等性,而使用方法来比较对象类型(String等)的相等性。如果使用比较两个Object类型,则要检查 身份 ,而不是相等性-也就是说,您要验证两个对象在内存中是否共享完全相同的引用(因此

  • 我有两个数组列表,一个是字符串列表,第二个是Toggle按钮列表。现在我想比较两个数组中的字符串。请帮助我。

  • 我有一个关于Java中字符串的简单问题。下面的简单代码段只是将两个字符串连接起来,然后将它们与进行比较。 比较表达式返回非常明显(我理解和之间的区别)。 当这两个字符串声明为时, 比较表达式在本例中返回。为什么会起作用?是不是一定要用实习生的钱呢?还是我被误导了?