gpt4 book ai didi

java - 将 TIMESTAMP (?) 用于 Java 和 MySQL 的日期时间持续时间

转载 作者:行者123 更新时间:2023-11-28 23:30:23 25 4
gpt4 key购买 nike

此时我正在使用 MySQL 数据库的 Java 应用程序中定义我的数据。我需要的一种数据是日期/时间段。我需要在日期时间存储附加数量。

否则我计划使用 Java LocalDateTime 和 MySQL 的 TIMESTAMP 数据类型来存储日期/时间。我计划使用 Java Timestamp 函数转换 LocalDateTime

我可以在 MySQL TIMESTAMP 中存储句点吗?它将如何处理“1 天 3 小时 6 分钟”作为 TIMESTAMP(不处于纪元)?如果不是,什么适合我正在使用的 Java 方法? TIA。

编辑添加的详细信息:这是供本地使用的,每个发行版在一个时区。 PC 上的 Java 应用程序是通过我的 Java GUI 捕获和查看 LocalDateTime 的地方,所需的粒度不超过分钟。然后,它们作为 TIMESTAMP 存储在数据库中。

周期将存储在数据库中的“类次模板”表中,作为相对于模板零点的开始和结束时间段,对于一个轮类周期中的每个类次。我将通过循环处理这些类次模板记录,计算从给定开始日期时间到提前几个月的所有“类次”记录(在 Java 中)。

使用示例:此示例模板将定义 4 名工作人员 8 天的 12 小时轮类,白天和晚上,每类工作 4 天,然后休息 4 天(此模板表中有 16 条记录)。所有值都是调用者零点的加法。每个预设模板记录包含:

  • 类次加金额
  • 类次开始的时间日期加量
  • 类次结束时间-日期加量
  • 轮类的船员标识符

网格模板(记录)
(时间段显示为 DD:hh:mm)
第 01 类:00:00:00 – 00:12:00,船员 A
类次 02:00:12:00 – 01:00:00,机组 B
类次 03:01:00:00 – 01:12:00,船员 A
……
09 类:04:00:00 – 04:12:00,机组 C
第 10 类:04:12:00 – 05:00:00,船员 D
…(到第 16 类)

接下来是我想从上述模板记录集中生成的轮类记录,使用 06/01/2016 06:00 作为开始日期时间(或零点)的示例,其中:

  • 类次
  • 转换开始日期-时间
  • 转换结束日期时间
  • 轮类的船员标识符

类次(记录)
(日期时间显示为 MM/DD/YYYY hh:mm)
类次 01:06/01/2016 06:00 – 06/01/2016 18:00,船员 A
类次 02:06/01/2016 18:00 – 06/02/2016 06:00,船员 B
类次 03:06/02/2016 06:00 – 06/02/2016 18:00,船员 A
……
类次 09:06/05/2016 06:00 – 06/05/2016 18:00,船员 C
第 10 类:06/05/2016 18:00 – 06/06/2016 06:00,船员 D
……
第 17 类:06/09/2016 06:00 – 06/09/2016 18:00,船员 A
第 18 类:06/09/2016 18:00 – 06/10/2016 06:00,船员 B
……
第 25 类:06/13/2016 06:00 – 06/13/2016 18:00,船员 C
第 26 类:06/13/2016 18:00 – 06/14/2016 06:00,船员 D
……

从“offset”到“period”进行了全面编辑,并做了一些澄清

最佳答案

“偏移”是错误的术语

在日期时间工作中,术语“偏移量”通常指的是与 UTC 的偏移量。偏移量是 UTC 线之前(东)或之后(西)的小时数、分钟数和秒数。时区是一组规则,用于处理偏移量调整以处理夏令时 (DST) 等异常情况。

您需要的术语是“elapsed”,以跟踪某些开始和停止时刻之间发生的时间量。

间隔

要跟踪从开始到停止的原始两个时刻,可以 (a) 创建您自己的间隔类来存储一对 InstantZonedDateTime 对象或 (b ) 使用 Interval ThreeTen-Extra 中的类扩展 java.time 类的项目(310 是 the JSR defining java.time 的数量)。

时长

要跟踪未附加到时间线的时间跨度,请使用 Duration类(class)。查看Oracle Tutorial on Period and Duration .持续时间跟踪总秒数加上几分之一秒(以纳秒为单位)。

Instant start = Instant.now();
Thread.sleep( 5000 ); // Milliseconds of sleep.
Instant stop = Instant.now();

Duration duration = Duration.between( start , stop );

java.time 类使用 ISO 8601默认情况下用于解析和生成字符串的标准格式作为其日期时间值的文本表示。对于持续时间,标准使用类似 P1DT3H6M 的格式表示“1 天 3 小时 6 分钟”。 P 标记开始(句点),T 将天与小时-分钟-秒分开。您可以存储这些字符串,因为它们可以很容易地由 java.time 处理。但他们当然不会自然而然地排序。

如果您需要对持续时间的长度进行排序或查询,我建议在数据库中写入一个整数,表示持续时间中的总分钟数(您指定的粒度)。您可以通过调用 Duration::toMinutes() 获得该总数.

由于您关心特定的日期和特定的时间跨度,因此您应该使用Local... 类型。 Local... 类型专门丢失了时区信息。如果没有时区信息,您将无法处理夏令时 (DST) 和其他异常情况。对于 Local... 类型,所有的日子都被假定为 24 小时,这在不同时区的现实生活中是不正确的。而是使用 Java 中的 ZonedDateTime 类型,以及接近 SQL 标准的 TIMESTAMP WITH TIME ZONE

的数据库类型

问题的其余部分让我望而却步,因为你所说的“移位模板”和“零点”而让我迷失了方向。但我的直觉告诉我,由于不了解处理日期时间数据的有效方法,你工作太辛苦了。日期时间处理 很棘手。我建议做更多的研究,例如在 Stack Overflow 上搜索和阅读与“java date”相关的问题。

关于java - 将 TIMESTAMP (?) 用于 Java 和 MySQL 的日期时间持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37513145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com