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

时间:2017-08-14 22:34:33

标签: java date

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

}

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

2 个答案:

答案 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;
    }

}

谢谢大家。