我正在处理酒店管理应用程序 [桌面] ,我注意到,酒店系统的日期更改时间不是00:00 am,它在 1AM之间和早上6点所以预订和房间状态等应保持到审核时间。当用户进行审核时,新的一天将开始。
这就是为什么我需要创建一个在午夜停止日期更改的方法,并在点击审核按钮时返回新日期。简而言之,我必须为日期创建中央系统。
结果;当我在所有课程中使用这个日期时,每个方法都会同步工作[封锁,预订,登记,退房等],但我找不到好办法。
我正在考虑这样的代码:
package com.coder.hms.utils;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class CustomDateFactory {
private Date date;
private Calendar calendar;
private SimpleDateFormat sdf;
public CustomDateFactory() {
//for formatting date as desired
sdf = new SimpleDateFormat("yyyy-MM-dd");
}
public void setValidDateUntilAudit(int counter) {
final Timer timer = new Timer();
final TimerTask task = new TimerTask() {
@Override
public void run() {
//get hour and minute from calendar
calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR);
int min = calendar.get(Calendar.MINUTE);
int sec = calendar.get(Calendar.SECOND);
//check if the field value equals -1
if (counter == -1) {
//and the time at 00:00
if (hour == 0 && min == 0 && sec == 2) {
//bring the date one day back
calendar.add(Calendar.DATE, counter);
date = calendar.getTime();
}
} else {
date = new Date();
}
}
};
timer.schedule(task, 0, 100);
}
public Date getDate() {
final String today = sdf.format(date);
final LocalDate ld = LocalDate.parse(today);
date = java.sql.Date.valueOf(ld);
return date;
}
}
评论后,我帮助我改变了我的代码:
public class DateFactoryTest {
private LocalDate currentDate;
private LocalDateTime localDateTime;
public DateFactoryTest() {
currentDate = LocalDate.now();
localDateTime = LocalDateTime.now();
}
private void setTheDate(boolean isAuditted) {
if (localDateTime.getHour() <= 6 && isAuditted == false) {
currentDate.minusDays(1);
} else if (localDateTime.getHour() > 6 && isAuditted == true) {
ImageIcon icon = new ImageIcon(getClass().getResource("/com/coder/hms/icons/dialogPane_question.png"));
int choosedVal = JOptionPane.showOptionDialog(null, "You're doing early audit, are you sure about this?",
"Approving question", 0, JOptionPane.YES_NO_OPTION, icon, null, null);
if (choosedVal == JOptionPane.YES_OPTION) {
isAuditted = false;
}
}
}
private LocalDate getDate() {
return currentDate;
}
}
所有答案,不同的想法都可以接受。
答案 0 :(得分:8)
避免使用麻烦的旧日期时间类,例如java.util.Date
。现在取代了java.time类。在这些过时的类中有java.sql.Date
- 如果JDBC驱动程序尚未针对JDBC 4.2及更高版本进行更新,则可能必须使用它,但如果是这样,请尽量减少其使用并执行而不是使用这些业务逻辑中的对象。
正如其他人评论的那样,不要破解日期的含义。如果“酒店日”确实从早上6点到早上6点运行,那么创建一个类来代表它。为LocalDate
类型的官方日期定义成员。定义LocalDateTime
类型的开始和结束成员,其中停靠点为plusDays( 1 )
。
定义一对getter方法,每个方法都带一个ZoneId
参数,并返回一个ZonedDateTime
,每个方法都是酒店当天开始和停止时的确切时刻。 LocalDateTime
不是实际时刻,在指定时区之前没有任何意义。夏令时(DST)等异常表示上午6点的开始或停止时间可能确实是特定日期的上午5点或上午7点或上午6点15分。
public startAtZone( ZoneId z ) {
ZonedDateTime zdt = this.startLocalDateTime.atZone( z ) ;
return zdt ;
}
将时间范围计算为Duration
。调用to…
方法获取总秒数,毫秒或纳秒。
Duration d = Duration.between( ZonedDateTime.now( z ) , myHotelDay.stopAtZone( z ) ) ;
请注意,定义时间跨度的最佳方法通常是半开放方法,其中开头是包含,结尾是独占。这意味着您的酒店日从早上6点开始运行,但不包括在下午6点。 这意味着6 AM to 6 AM
,因此无需确定05:59:59.999或05:59:59.999999或05:59:59.999999999。使用>= && <
逻辑进行搜索,然后不使用SQL BETWEEN
。
顺便说一句,Timer
现在已成为遗产。阅读Executors框架,并搜索Stack Overflow。
顺便提一下,您使用的格式yyyy-MM-dd
由ISO 8601标准定义。在解析/生成字符串时,java.time类默认使用这些标准格式。
答案 1 :(得分:0)
最后我通过更改代码逻辑修复了我的问题。现在代码不会在00:00停止日期,但是如果Audit == false并且时间&lt; 6,同样的逻辑,它返回当前日期或旧日期等。
到目前为止,我的代码是这样的:
package com.coder.hms.utils;
import java.time.LocalDate;
import java.time.LocalDateTime;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
public class CustomDateFactory {
private LocalDate currentDate;
private LocalDateTime localDateTime;
private final ImageIcon icon = new ImageIcon(getClass().
getResource("/com/coder/hms/icons/dialogPane_question.png"));
public static void main(String[] args) {
CustomDateFactory dateFactoryTest = new CustomDateFactory();
dateFactoryTest.setValidDateUntilAudit(true);
//for test
String realDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
System.out.println("REAL DATE : " + realDate);
System.out.println("PREPARED DATE : " + dateFactoryTest.getDate());
}
public CustomDateFactory() {
localDateTime = LocalDateTime.now();
}
private void setValidDateUntilAudit(boolean isAuditted) {
if (localDateTime.getHour() <= 6 && isAuditted == false) {
currentDate = LocalDate.now();
currentDate = currentDate.minusDays(1);
}
else if(localDateTime.getHour() < 6 && isAuditted == true) {
int choosedVal = JOptionPane.showOptionDialog(null, "You're doing early audit, are you sure about this?",
"Approving question", 0, JOptionPane.YES_NO_OPTION, icon, null, null);
if (choosedVal == JOptionPane.YES_OPTION) {
currentDate = LocalDate.now();
isAuditted = false;
}
else {
currentDate = LocalDate.now();
currentDate = currentDate.minusDays(1);
}
}
else if (localDateTime.getHour() > 6 && isAuditted == true) {
int choosedVal = JOptionPane.showOptionDialog(null, "Are you sure about this?",
"Approving question", 0, JOptionPane.YES_NO_OPTION, icon, null, null);
if (choosedVal == JOptionPane.YES_OPTION) {
currentDate = LocalDate.now();
isAuditted = false;
}
else {
currentDate = LocalDate.now();
currentDate = currentDate.minusDays(1);
isAuditted = false;
}
}
}
private LocalDate getDate() {
return currentDate;
}
}
谢谢大家。