Java json中的日期时间字段

Java json中的日期时间字段,java,json,postgresql,jackson,Java,Json,Postgresql,Jackson,我们如何在json对象的JavaPOJO类中存储PostgresDateTime对象?我正在尝试对它们进行排序,并想检查是否应该比较datetime或字符串?Date compareTo不起作用,但字符串compareTo对datetime对象起作用 私人约会场; 私人日期字段b fieldA.与(fieldB)相比 您应该使用java.time.LocalDateTime类。这是一个新的(Java8)类,用于表示没有任何特定时区或偏移量的日期和时间 换句话说,你可以把它想象成一年、一个月、一天

我们如何在json对象的JavaPOJO类中存储PostgresDateTime对象?我正在尝试对它们进行排序,并想检查是否应该比较datetime或字符串?Date compareTo不起作用,但字符串compareTo对datetime对象起作用

私人约会场; 私人日期字段b


fieldA.与(fieldB)相比

您应该使用
java.time.LocalDateTime
类。这是一个新的(Java8)类,用于表示没有任何特定时区或偏移量的日期和时间

换句话说,你可以把它想象成一年、一个月、一天、一小时、一分钟、一秒和一毫秒。但由于没有指定时区或偏移量,它实际上并不对应于特定的
瞬间
——即特定的时间点

在我看来,在所有与Java8日期/时间相关的类中,这个类最接近于数据库的DateTime字段中存储的内容

进一步阅读:巴兹尔·布尔克的答案

tl;博士 我们如何在JavaPOJO类中存储json对象

视情况而定

  • 对于带有时区的时间戳的Postgres列,请使用类
  • 对于不带时区的时间戳为
    的Postgres列,请使用类
至于JSON,日期时间值没有JSON数据类型。生成标准ISO 8601格式的字符串

我正试着把它们分类

time类知道如何进行排序,实现接口

如果我要比较日期时间或字符串

始终使用智能对象,而不是哑字符串。这就是为什么你有技术和经验

日期比较不起作用

永远不要使用
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() ;