我目前在使用MySQL数据库的Java应用程序中定义我的数据。我需要的一种数据是日期/时间段。我需要在日期时间存储添加剂量。
我计划使用Java LocalDateTime
和MySQL的TIMESTAMP
数据类型来存储日期/时间。我计划使用Java LocalDateTime
函数转换Timestamp
。
我可以在MySQL TIMESTAMP
中存储句点吗?它将如何处理" 1天,3小时和6分钟"作为TIMESTAMP
(没有在一个时代)?如果没有,那么我使用的Java方法会有什么效果? TIA。
DETAILS编辑添加:
这是供本地使用,在每个分发的一个时区。 PC上的Java应用程序将通过我的Java GUI捕获和查看LocalDateTime
,其中所需的粒度将不会超过几分钟。然后,它们作为TIMESTAMP
存储在数据库中。
这些时段将存储在"班次模板中。数据库中的表,作为相对于模板零点的开始和结束时间段,用于一个轮班周期中的每个班次。我将计算所有" Shift"通过循环处理这些班次模板记录,从给定的开始日期时间到预定的几个月的记录(在Java中)。
使用示例: 该样本模板将定义12小时轮班,白天和夜晚,为期8天,为4名工作人员,每人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:0000-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
...
全程编辑,来自"偏移"到"期间",并做了一些澄清
答案 0 :(得分:1)
在日期时间工作中,术语“偏移”通常是指从UTC偏移。偏移量是UTC线前面(东)或后面(西)的小时,分钟和秒数。时区是一组规则,用于处理对偏移的调整以处理诸如夏令时(DST)之类的异常。
您需要的术语是“已过去”,用于跟踪某些开始和停止时刻之间发生的时间。
要跟踪从开始和停止的原始两个时刻,要么(a)创建自己的间隔类,存储一对Instant
或ZonedDateTime
个对象,或者(b)使用{{3扩展java.time类的Interval
项目中的类(310是ThreeTen-Extra的数量)。
要跟踪未附加到时间轴的时间跨度,请使用the JSR defining java.time课程。请参阅Duration
。持续时间跟踪总秒数加上几分之一秒(纳秒)。
Instant start = Instant.now();
Thread.sleep( 5000 ); // Milliseconds of sleep.
Instant stop = Instant.now();
Duration duration = Duration.between( start , stop );
默认情况下,java.time类使用Oracle Tutorial on Period and Duration标准格式来解析和生成字符串作为其日期时间值的文本表示。对于持续时间,标准使用P1DT3H6M
之类的格式“1天,3小时和6分钟”。 P
标记开头(句点),T
标记小时 - 分钟 - 秒。您可以存储这些字符串,因为它们可以通过java.time轻松处理。但他们当然不会自然而然。
如果您需要对持续时间的长度进行排序或查询,我建议在数据库中写一个整数,表示持续时间内的总分钟数(您声明的粒度)。您可以致电ISO 8601获取该总人数。
由于您关心特定日期和特定时间跨度,因此不使用Local…
类型。 Local…
类型特别丢失了时区信息。没有时区信息,您将无法处理夏令时(DST)和其他异常情况。对于Local…
类型,假设所有日期都是24小时,这在不同时区的现实生活中是不正确的。而是在Java中使用ZonedDateTime
类型,并使用接近SQL标准TIMESTAMP WITH TIME ZONE
问题的其余部分使我失望,因为你谈论“轮班模板”和“零点”而使我失望。但是我的直觉告诉我,由于不了解处理日期时间数据的有效方法,你工作太辛苦了。日期时间处理 很棘手。我建议做更多的学习,比如在Stack Overflow上搜索和阅读“java date”相关的问题。