我正在研究酒店管理应用程序[桌面],我注意到,酒店系统的日期更改时间不是00:00 am,在凌晨1点到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;
}
}
Run Code Online (Sandbox Code Playgroud)
评论后,我帮助我改变了我的代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
所有答案,不同的想法都可以接
避免麻烦的旧日期时间类,如java.util.Date.现在取代了java.time类.在这些过时的类是java.sql.Date-你可能不得不使用它,如果你的JDBC驱动程序尚未更新的JDBC 4.2及更高版本,但即便如此,尽量减少其使用,也不会在你的业务逻辑中使用这些对象.
正如其他人评论的那样,不要破解日期的含义.如果"酒店日"确实从早上6点到早上6点运行,那么创建一个类来代表它.定义类型的官方日期的成员LocalDate.还定义开始成员和停止,类型LocalDateTime,这里的站plusDays( 1 ).
定义一对getter方法,每个方法都接受一个ZoneId参数,然后返回a ZonedDateTime,每个方法都用于酒店日开始和停止时的确切时刻.A LocalDateTime不是实际时刻,在指定时区之前没有任何意义.夏令时(DST)等异常表示上午6点的开始或停止时间可能确实是特定日期的上午5点或上午7点或上午6点15分.
public startAtZone( ZoneId z ) {
ZonedDateTime zdt = this.startLocalDateTime.atZone( z ) ;
return zdt ;
}
Run Code Online (Sandbox Code Playgroud)
计算时间跨度为a Duration.调用to…方法以获得总秒数,毫秒数或纳秒数.
Duration d = Duration.between( ZonedDateTime.now( z ) , myHotelDay.stopAtZone( z ) ) ;
Run Code Online (Sandbox Code Playgroud)
请注意,定义时间跨度的最佳方法通常是半开放方法,其中开头是包含性的,结尾是排他性的.这意味着你的酒店天开始在上午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类默认使用这些标准格式.
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |