Java json中的日期时间字段
我们如何在json对象的JavaPOJO类中存储PostgresDateTime对象?我正在尝试对它们进行排序,并想检查是否应该比较datetime或字符串?Date compareTo不起作用,但字符串compareTo对datetime对象起作用 私人约会场; 私人日期字段bJava json中的日期时间字段,java,json,postgresql,jackson,Java,Json,Postgresql,Jackson,我们如何在json对象的JavaPOJO类中存储PostgresDateTime对象?我正在尝试对它们进行排序,并想检查是否应该比较datetime或字符串?Date compareTo不起作用,但字符串compareTo对datetime对象起作用 私人约会场; 私人日期字段b fieldA.与(fieldB)相比 您应该使用java.time.LocalDateTime类。这是一个新的(Java8)类,用于表示没有任何特定时区或偏移量的日期和时间 换句话说,你可以把它想象成一年、一个月、一天
fieldA.与(fieldB)相比 您应该使用
java.time.LocalDateTime
类。这是一个新的(Java8)类,用于表示没有任何特定时区或偏移量的日期和时间
换句话说,你可以把它想象成一年、一个月、一天、一小时、一分钟、一秒和一毫秒。但由于没有指定时区或偏移量,它实际上并不对应于特定的瞬间
——即特定的时间点
在我看来,在所有与Java8日期/时间相关的类中,这个类最接近于数据库的DateTime字段中存储的内容
进一步阅读:巴兹尔·布尔克的答案tl;博士
我们如何在JavaPOJO类中存储json对象
视情况而定
- 对于带有时区的时间戳的Postgres列,请使用类
- 对于不带时区的时间戳为
的Postgres列,请使用类
java.util.Date
类。永远不要使用java.sql.Date
类。仅使用java.time类
字符串comparTo适用于日期时间对象
没有。日期时间字符串可以采用各种格式,使用各种人类语言和文化规范,并应用不同的时区或UTC偏移量。字符串不适合对日期时间值进行排序。使用智能java.time对象,而不是哑字符串
或者在数据库端进行排序,Postgres针对这些琐事进行了优化
私人约会场;私人日期字段b
这样做:
private Instant fieldA, fieldB ;
…
boolean isAEarlier = fieldA.isBefore( fieldB ) ;
boolean isAtheSame = fieldA.equals( fieldB ) ; // Note that some other java.time classes have `isEqual` method as well as `equals` method.
boolean isALater = fieldA.isAfter( fieldB ) ;
boolean isAEqualToOrLaterThan = ( ! fieldA.isBefore( fieldB ) ) ; // "Is equal to or later than" is a common use-case. "Not before" is a logical shortcut with the same effect.
java.time
Date
类现在是遗留类,是多年前被java.time类取代的非常麻烦的旧日期时间类的一部分。切勿使用日期、日历、简单格式等
你的问题重复了许多其他问题,所以我在这里简单介绍一下。搜索堆栈溢出以了解更多信息
附在时间表上
对于SQL标准中定义并在Postgres中使用的带有时区的数据库列类型TIMESTAMP,它表示一个时刻,即时间线上的一个特定点
在中,此类型的分辨率为,并且始终处于。任何带有时区或UTC偏移指示器的输入都将调整为UTC,然后区域/偏移将被丢弃。因此,该类型有点用词不当,因为原始区域/偏移量被遗忘,存储的值始终以UTC为单位。其他数据库在这种行为上可能会有所不同,所以要小心,因为SQL规范几乎没有涉及日期时间的主题
请注意,当使用除以外的工具时,您的工具可能会在检索存储的UTC值后注入或;对于新手来说,这可能会产生误导和混淆(在我看来,这是一个不幸的设计决策)
在Java中,通常最好使用。作为一名程序员,学习像UTC一样思考、存储和交换瞬间。通常,使用Instant
类进行此操作。为了在类中定义成员变量,Instant
是您的目标类
Instant instant = Instant.now() ; // Capture the current moment in UTC, with a resolution as fine as nanoseconds.
您可能希望将任何值截断到微秒,以匹配从Postgres检索到的值。使用指定分辨率
要在用户所需/预期的时区向用户演示,请分配一个以获取一个
以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
要返回UTC,请提取一个Instant
Instant instant = zdt.toInstant() ;
要生成表示ZonedDateTime
对象值的本地化文本,请使用DateTimeFormatter
。搜索堆栈溢出以获取更多信息
未附加到时间线
不带时区的数据库类型TIMESTAMP
故意缺少任何时区或UTC偏移的概念。因此,它并不代表一个时刻,也不是时间线上的一个点,也不是您在业务应用程序中可能想要的,除非:
- 安排未来的约会
- 表示每个区域或任何区域(而不是特定区域)的日期和时间概念
在Postgres中,任何伴随输入的区域或偏移都将被忽略。日期和时间按原样存储,无需调整
Java中的匹配类型为
该类名中的“Local”并不表示“特定的位置”。恰恰相反!它指的是每一个地方,或任何地方,但不是一个特定的地方。如果您不理解这一点,请进行一些研究,阅读类文档,并搜索堆栈溢出
数据库
使用智能对象而不是哑字符串与数据库交换日期时间值
截至,您可以直接与数据库交换java.time对象。切勿使用java.sql.Timestamp
、java.sql.Date
和java.sql.Time
储藏室
myPreparedStatement.setObject( … , instant ) ;
检索
Instant instant = myResultSet.getObject( … , Instant.class ) ;
JSON
该规范定义了很少的数据类型,并且没有一种与日期时间相关。你在那里只能靠自己了。我也是
ISO 8601
序列化数据时
myPreparedStatement.setObject( … , instant ) ;
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Instant instant = Instant.parse( "2018-01-23T01:23:45.123456Z" ) ;
String output = instant.toString() ;