如何在00:00停止更改日期?

Cod*_*JHP 4 java date

我正在研究酒店管理应用程序[桌面],我注意到,酒店系统的日期更改时间不是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)

所有答案,不同的想法都可以接

Bas*_*que 8

避免麻烦的旧日期时间类,如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类默认使用这些标准格式.

  • @CoderACJHP解析日期的方法有很多种,比如使用`DateTimeFormatter`,只需搜索一下(`SimpleDateFormat`现已过时).这是[Oracle教程](https://docs.oracle.com/javase/tutorial/datetime/iso/format.html). (4认同)