用Java计算日期和时差

时间:2013-12-23 19:40:37

标签: java date datetime

我有三个数据库(SQLServer)字段:

  1. startDate(日期)
  2. endDate(日期)
  3. 持续时间(文字)。
  4. 我正在使用java以下代码计算日期和时间差异。

    public static void main(String[] args) {
    
          DateTimeUtils obj = new DateTimeUtils();
          SimpleDateFormat simpleDateFormat = 
                    new SimpleDateFormat("dd/M/yyyy hh:mm:ss");
    
          try {
    
            Date date1 = simpleDateFormat.parse("10/10/2013 11:30:10");
            Date date2 = simpleDateFormat.parse("13/10/2013 20:55:55");
    
            obj.printDifference(date1, date2);
    
          } catch (ParseException e) {
            e.printStackTrace();
          }
    
        }
    
    public void printDifference(Date startDate, Date endDate){
    
            //milliseconds
            long different = endDate.getTime() - startDate.getTime();
            String diff = "";
            System.out.println("startDate : " + startDate);
            System.out.println("endDate : "+ endDate);
            System.out.println("different : " + different);
    
    
            diff = String.format("%d:%d", TimeUnit.MILLISECONDS.toHours(different), TimeUnit.MILLISECONDS.toMinutes(different) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(different)));
    

    并返回“HH:MM”并将Duration字段更新为我的数据库中的String。这非常有效。

    现在会有多个持续时间,我想做的就是一旦我有持续时间,我想加上多个持续时间,它应该返回totalDuration:

    例如: 在我的表#1 中,

    Id |持续时间

    1001 | 05:04

    1001 | 12时19

    1001 | 2点16分

    表#2

    Id | totalDuration

    1001 | 19:39

    我的问题是:如何将HH:Mm转换为日期并将多个记录一起添加以获得totalDuration。总持续时间应为文本并返回相同格式“HH:MM

3 个答案:

答案 0 :(得分:1)

如果你在表1中确实有开始和结束的日期值,那么使用datediff并将值加总会容易得多。

答案 1 :(得分:0)

如果你仍然拥有你所计算出的所有值,那么只要累积一个很长的毫秒计数就可以使用它。

如果没有,那么有几种方法,最简单的可能是:

String[] split = duration.split(":");
long duration = Long.parseLong(split[0])*60*60*1000 + Long.parseLong(split[1])*60*1000;

然后,您可以循环遍历所有这些持续时间,然后在最后将其转换回String

实际上,您应该将毫秒计数存储在数据库中,然后将其转换为要显示的文本。

答案 2 :(得分:0)

问题不明确

你的问题不明确。 (a)问题未能解决时区问题。这些日期时间是否均为UTC / GMT? (b)您的示例日期似乎相隔3天,但您的代码仅返回小时和分钟。

约达时间

尝试滚动自己的日期时间计算通常会导致麻烦和挫败感。查看一个好的日期时间库是否可以帮助您,例如Joda-Time或与Java 8捆绑在一起的新java.time。*类。

ISO 8601持续时间

日期和时间的国际标准ISO 8601定义了一种处理所谓durations的方式。从历史上看,这个概念也被称为时期。持续时间以年,月,日,小时和分钟的形式跟踪经过时间的概念。

值以PnYnMnDTnHnMnS的格式表示为字符串。 'P'表示持续时间(Period)字符串的开头。 'T'表示时间部分。每个数字都在其元素指示符之前。例如,“P3Y6M4DT12H30M5S”表示持续时间为“三年,六年,四天,十二小时,三十分钟和五秒”。

Joda-Time是ISO 8601精明,提供Period class来表示ISO持续时间。可以通过传递ISO持续时间字符串来构造Period。同样,Period上的默认toString实现输出ISO持续时间字符串。您可以将ISO持续时间字符串存储在数据库中。可以通过调用plus方法将Joda-Time Period实例添加到一起。

示例代码

这是使用Java 7中的Joda-Time 2.3的示例代码。我从您的问题中获取了两个日期时间字符串。为了演示添加,我再加5分钟。

良好的做法要求明确时区而不是依赖默认值。在这里我使用巴黎,任意选择。您可能正在使用UTC / GMT(没有时区偏移),在这种情况下,您可以传递预定义的时区DateTimeZone.UTC

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

DateTimeZone timeZone_Paris = DateTimeZone.forID( "Europe/Paris" ); // Or for UTC/GMT, use: DateTimeZone.UTC
DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd/MM/yyyy HH:mm:ss" ).withZone( timeZone_Paris );

DateTime start = formatter.parseDateTime( "10/10/2013 11:30:10" );
DateTime stop = formatter.parseDateTime( "13/10/2013 20:55:55" );
Period period = new Period( start, stop );

DateTime now = new DateTime( timeZone_Paris );
Period period2 = new Period( now , now.plusMinutes( 5 ));

Period total = period.plus( period2 );

转储到控制台...

System.out.println( "start: " + start.toString() );
System.out.println( "stop: " + stop.toString() );
System.out.println( "period: " + period.toString() );
System.out.println();
System.out.println( "now: " + now.toString() );
System.out.println( "period2: " + period2.toString() );
System.out.println();
System.out.println( "total: " + total.toString() );

跑步时......

start: 2013-10-10T11:30:10.000+02:00
stop: 2013-10-13T20:55:55.000+02:00
period: P3DT9H25M45S

now: 2013-12-24T01:03:10.029+01:00
period2: PT5M

total: P3DT9H30M45S

请注意25M如何增加到30M

日期时间字符串

提示:如果您控制这些日期时间字符串,如示例代码所示,如​​果您切换到使用标准ISO 8601格式,您的工作将会更容易。例如:2013-12-21T21:03:48+05:302013-12-21T21:03:48Z

使用“dd / M / yyyy hh:mm:ss”格式是不明确的。没有理由使用它而不是标准格式。奖励:标准格式按字母顺序排序时按时间顺序排列。