当前位置: 首页 > 知识库问答 >
问题:

计算日差时遇到的问题

酆晔
2023-03-14

我对编码相当陌生,所以这可能是一个愚蠢的问题,但我找不到任何解决方案。我想计算到日期之间的差异(以天为单位)。它在大多数情况下都有效,但当月份发生变化时,我会得到奇怪的解决方案<第一个例子:
今天-2018年9月30日=78天,
今天-2018年9月31日=79天(?)
今天-2018年10月1日=80天
第二个例子:
今天-2018年8月31日=49天,
今天-2018年9月1日=49天

密码

private static int[] abstandTage(GregorianCalendar date1, ArrayList<GregorianCalendar> csvDate)
{
    int[] abstand = new int[csvDate.size()];
    int i = 0;
    while ( i < csvDate.size() )
    {
        long diffInMillis = csvDate.get(i).getTimeInMillis() - date1.getTimeInMillis();
        long tage = diffInMillis / 1000 / 60 / 60 / 24;
        abstand[i] = (int) tage;
        i++ ;
    }

    return abstand;
}

date1是一个预定义的日期,csvDate是一个带有日期的列表。有人能帮我吗?

提前谢谢Alex

共有3个答案

马正初
2023-03-14

如上所述,您必须在此处使用LocalDate:

SimpleDateformat sdf = new SimpleDateFormat("yyyyMMdd");
Date date1 = sdf.parse("20180713);
Date date2 = sdf.parse("20180930");
LocalDate startDate = 
date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate endDate = 
date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
long days = ChronoUnit.DAYS.between(startDate, endDate);
return days;

从公历到日期的转换通过以下方式完成:

Date newDate = new Date(date1.getTime());
袁奇文
2023-03-14

如果创建GregorianCalendar对象,例如7月13日的new GregorianCalendar(2018,7,13),就会发生这种情况GregoriaCalendar使用了一个奇怪的月份编号,所以你不会得到7月13日。

解决方案是扔掉那个过时且设计拙劣的类,使用例如LocalDate创建日期。(2018年7月13日)甚至更好,LocalDate。年月日(2018年7月13日)。然后使用ChronoUnit。天。用于查找日期之间的天数。

链接:Oracle教程:Date Time解释如何使用java.time,这是现代Java日期和时间API。

东方夕
2023-03-14

可以使用ChronoUnit计算差异数组。您还可以使用流来进一步简化实现:

private static int[] abstandTage(GregorianCalendar date1,
          ArrayList<GregorianCalendar> csvDate) {

    return csvDate.stream()
            .mapToInt(csvdate -> (int) 
               ChronoUnit.DAYS.between(date1.toZonedDateTime(), csvdate.toZonedDateTime()))
            .toArray();
}
 类似资料:
  • 问题内容: 我想以小时/分钟/秒为单位计算两个日期之间的差异。 我的代码在这里有一个小问题: 这应该产生: 但是我得到这个结果: 有人可以在这里看到我在做什么错吗? 问题答案: 尝试 注意:这假定diff是非负数。

  • 问题内容: 在我的程序开始和结束时, 但是,当我尝试区别时,我会遇到语法错误…。我做错了一些事情,但是我不确定发生了什么… 基本上,我只想在程序开始时将时间存储在变量中,然后将第二次时间存储在末尾的第二个变量中,然后在程序的最后一位中计算差并显示出来。我不是要为功能速度计时。我正在尝试记录用户通过某些菜单花费的时间。做这个的最好方式是什么? 问题答案: 该模块将为您完成所有工作: 如果您不想显示微

  • 问题内容: 我觉得很有趣,Java(或java.util库)没有内置函数来计算日期差。我想从另一个减去一个日期,以获得它们之间的经过时间。做这个的最好方式是什么? 我知道简单的方法是将时间差以毫秒为单位,然后将其转换为天。但是,我想知道这是否在所有情况下都有效(带夏令时等)。 问题答案: 如果您关注开放源代码,那么Java并不会丢失太多:尝试Joda-Time。

  • 我已经成功地设置了Elasticsearch、Kibana等,当我运行:'sudo systemctl status Elasticsearch'时,它都运行得很好。 但是,当我执行“sudo systemctl status logstash”时,这是输出: 它无法启动logstash,我在网上读了很多文章,说这可能与路径或配置有关,但我没有找到一个正确的工作解决方案。 我已经下载了JDK,并遵

  • 问题内容: 我试图找出表中某些字段之间的时间。但是由于我正在使用Postgresql :(( 我无法使用DATEDIFF函数。我在网上找不到任何清晰的指南/教程,这些指南/教程显示了如何在Postgres中执行类似的操作,因此我需要做同样的事情的帮助但在Postgres 我假设如果我使用支持DATEDIFF函数的RDBMS,则此查询将起作用,因此,基本上我的问题是如何更改它,以便它使用Postgr

  • 本文向大家介绍vue计算属性时v-for处理数组时遇到的一个bug问题,包括了vue计算属性时v-for处理数组时遇到的一个bug问题的使用技巧和注意事项,需要的朋友参考一下 问题 bug: You may have an infinite update loop in a component render function 无限循环 1.需要处理的数组(在 ** ssq **里): 2.计算属性