【发布时间】:2021-10-13 00:14:29
【问题描述】:
有人可以帮我解决这个困惑吗?我需要显示每个工人的总工作时间。有不同的工作轮班。在这种情况下,最复杂的一个是黎明班,当人们从一天的 21:00 工作到第二天的 7:00 时,考虑到日间偏移,即 10 月 31 日,瑞士有时间变化。我打算只在国内应用这个逻辑。对于这种情况,以下代码是否是可靠的解决方案?我试图了解 java.time 和许多针对此特定问题的帖子,但它们都变得更加混乱。
public String saveWorkTime(@Valid @ModelAttribute("workCalc") WorkCalculator workCalculator,
BindingResult bindingResult, ModelMap modelMap) throws ParseException {
(...)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date startDT = sdf.parse(workCalculator.getStartDate() + " " + workCalculator.getStartTime());
Date endDT = sdf.parse(workCalculator.getEndDate() + " " + workCalculator.getEndTime());
long timeDiffMilli = endDT.getTime() - startDT.getTime();
long timeDiffMin = TimeUnit.MILLISECONDS.toMinutes(timeDiffMilli) % 60;
long timeDiffH = TimeUnit.MILLISECONDS.toHours(timeDiffMilli) % 24;
workCalculator.setTotalWorkH(timeDiffH);
workCalculator.setTotalWorkMin(timeDiffMin);
workCalculatorService.save(workCalculator);
return "redirect:/index";
}
我的实体模型如下所示:
(...)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "start_date")
private String startDate;
@Column(name = "end_date")
private String endDate;
@Column(name = "total_work_h")
private long totalWorkH;
@Column(name = "total_work_min")
private long totalWorkMin;
@Column(name = "end_time")
private String endTime;
@Column(name = "start_time")
private String startTime;
(...)
我的 Db 架构如下所示:
(...)
CREATE TABLE `work_calc` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`start_date` varchar(30) DEFAULT NULL,
`end_date` varchar(30) DEFAULT NULL,
`start_time` varchar(20) DEFAULT NULL,
`end_time` varchar(20) DEFAULT NULL,
`total_work_h` int(10) DEFAULT NULL,
`total_work_min` int(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
提前感谢大家的努力和时间。
【问题讨论】:
-
在重要时始终调用 setTimeZone(),您部署的服务器的默认时区可能不使用瑞士时间。
-
mysql为什么不处理呢? dev.mysql.com/doc/refman/8.0/en/time-zone-support.html
-
通常应该避免“数学”时间操作,这就是创建 JodaTime 的原因,我们现在拥有
java.timeAPI -
我建议你不要使用
SimpleDateFormat和Date。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。在数据库端使用timestamp with time zone。在实体中使用ZonedDateTime是可以的,OffsetDateTime是你必须让它工作。在一段时间内使用来自java.time, the modern Java date and time API 的Duration类。 -
您的实体存在冗余。看到你可以避免这种情况。工作时间可以从开始到结束计算(如果我理解正确的话),所以不应该存储。
标签: java spring-boot date java-time datetimeoffset