我对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方法进行比较,它的工作就很好了。
有没有人能在这方面给我一些启示,并好心地指导我克服我的错误。
提前感谢。
与编码相比,你的编码会分散注意力。例外情况是将字符串输入解析为对象。
另一个问题:您在第二个和第三个输入上使用了错误的类。
另一个问题是:在调用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.Date
、Calendar
、
要了解更多信息,请参阅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未来可能添加内容的试验场。时间您可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
等。
我试图将日期字符串解析为,如下所示。 但我有点例外,
我正在将日期/日期时间字符串转换为,我有一种日期时间格式,它可能有以下值之一: 有时有时间和没有时间,我需要将其转换为。 我已经尝试了下面的代码 因为没有时间,我将它设置为默认值,但是当我试图解析时 它抛出的错误类似于 线程"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中字符串的简单问题。下面的简单代码段只是将两个字符串连接起来,然后将它们与进行比较。 比较表达式返回非常明显(我理解和之间的区别)。 当这两个字符串声明为时, 比较表达式在本例中返回。为什么会起作用?是不是一定要用实习生的钱呢?还是我被误导了?