Java中排除周末的日期差异计算

She*_*ila 2 java datediff date-difference

我对 Java 平台非常初学者和陌生。我有以下 3 个简单的 Java 日期差计算函数。我想在所有 3 种方法中排除以下计算中的周末。任何人都可以帮助如何在以下 dateDiff 计算中排除周末吗?

public static String getDatesDiff(String date1, String date2) {

    String timeDiff = "";
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date d1 = null;
    Date d2 = null;

    try {
        d1 = format.parse(date1);
        d2 = format.parse(date2);
        long diff = d2.getTime() - d1.getTime();
        timeDiff = ""+diff;
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
    return timeDiff;
}
Run Code Online (Sandbox Code Playgroud)
public static String getDatesDiffAsDays(String date1, String date2) {
    String timeDiff = "";
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date d1 = null;
    Date d2 = null;

    try {
        d1 = format.parse(date1);
        d2 = format.parse(date2);
        long diff = d2.getTime() - d1.getTime();
        String days = ""+(diff / (24 * 60 * 60 * 1000));
            
        timeDiff = days;
        timeDiff = timeDiff.replaceAll("-", "");
        timeDiff = timeDiff+" days";
            
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
    return timeDiff;
}
Run Code Online (Sandbox Code Playgroud)
public static String getDatesDiffAsDate(String date1, String date2) {
    String timeDiff = "";
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date d1 = null;
    Date d2 = null;

    try {
        d1 = format.parse(date1);
        d2 = format.parse(date2);
        long diff = d2.getTime() - d1.getTime();
        String days = (diff / (24 * 60 * 60 * 1000))+" days";
        String hours = (diff / (60 * 60 * 1000) % 24)+"h";
        String minutes = (diff / 1000 % 60)+"mts";
        String seconds = (diff / (60 * 1000) % 60)+"sec";
    
        timeDiff = days;
        timeDiff = timeDiff.replaceAll("-", "");
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
    return timeDiff;
}
Run Code Online (Sandbox Code Playgroud)

rzw*_*oot 6

这段代码从根本上被破坏了。java.util.Date不代表日期,它代表时间戳。但如果你处理的是时间上的时刻,你就会遇到一个问题:并不是所有的日子都是 24 小时。例如,实行夏令时,某些日子为 25 或 23 小时。在地球上特定地点的特定时刻,整个日子都会被跳过,例如当一个地方改变了国际日期变更线的哪一侧时,或者当俄罗斯最后一个从儒略历转换为公历时(著名的十月)革命?是的,这实际上发生在 11 月!)

\n

使用LocalDate它代表实际日期,而不是时间戳。不要使用Date, 或SimpleDateFormat\xe2\x80\x93 这些已经过时并且大部分都破坏了日期和时间。这java.time方案是经过深思熟虑的。

\n

“周末”是什么时候?在某些地方,周五和周六被视为周末,而不是周六和周日。

\n

如果您排除周末,那么您可能还想排除法定假期。许多国家规定,1 月 1 日,无论是哪一天,都算作星期日,例如,无论政府建筑和服务是否开放。

\n

您需要从中吸取的教训:

\n
    \n
  • 日期非常复杂,因此对于教授基本原理来说是一个可怕的想法。
  • \n
  • 切勿使用java.util.DateCalendarGregorianCalendarSimpleDateFormat, 。使用中的东西java.time代替。
  • \n
  • 如果你像这样写数学,你可能做错了 \xe2\x80\x93 例如ChronoUnit.DAYS.between(date1, date2)为你做了所有的数学。
  • \n
  • 您可能应该从开始日期开始,然后开始循环:检查该日期是否算作工作日(如果是,则增加计数器),然后转到第二天。继续下去,直到该天等于结束日期,然后返回该计数器。是的,这很“慢”,但是计算机会很乐意为您瞬间完成 200 万天(相当于 5000 多年的时间)。好处是你可以计算一天是否算作“工作日”(这可能会变得非常复杂。例如,大多数欧洲大陆国家和我认为美国也规定复活节是公共假期。去查一下以及如何知道复活节是什么时候。不过,先煮点咖啡)。
  • \n
  • 如果您确实坚持公式化并将周末定义为星期六和星期日,那么最好分别计算两个日期之间有多少整周,并将其乘以 5,然后在范围前面分别添加半周“ ’以及后面的半周。即使您要求假设的范围为一百万年,这也会很快。
  • \n
  • 这不是处理异常的方式。throws X如果您现在不想处理它,请添加,或者,输入throw new RuntimeException("unhandled", e);,或者放入您的 catch 块。不是这个,这个太可怕了。它记录了一半的错误,并盲目地继续前进,状态无效。
  • \n
  • 几乎所有有趣的问题,例如“这个日期是假期吗?” 如果不知道您所在的文化/地区,则无法回答。这包括看似明显的常量,例如“星期六是周末吗?”。
  • \n
\n