Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java计算日期和时间差_Java_Date_Datetime - Fatal编程技术网

用Java计算日期和时间差

用Java计算日期和时间差,java,date,datetime,Java,Date,Datetime,我有三个数据库(SQLServer)字段: 起始日期(日期) 结束日期(日期) 持续时间(文本) 我正在使用java代码计算日期和时间差 public static void main(String[] args) { DateTimeUtils obj = new DateTimeUtils(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/M/yyyy h

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

  • 起始日期(日期)
  • 结束日期(日期)
  • 持续时间(文本) 我正在使用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”,并在我的数据库中将持续时间字段更新为字符串。这很有效

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

    例如: 在我的表格#1

    Id |持续时间

    1001 | 05:04

    1001 | 12:19

    1001 | 02:16

    表2

    Id |总持续时间

    1001 | 19:39


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

    ,如果仍然计算出所有值,则只需在运行时累积一个长毫秒计数并使用它即可

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

    String[] split = duration.split(":");
    long duration = Long.parseLong(split[0])*60*60*1000 + Long.parseLong(split[1])*60*1000;
    
    然后,您可以循环添加所有这些持续时间,然后在最后将其转换回
    字符串


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

    如果表1中实际有开始和结束的日期值,则使用datediff和求和值会容易得多。

    问题不清楚 您的问题不清楚。(a)问题无法解决时区问题。这些日期时间都是UTC/GMT吗?(b)您的示例日期似乎相隔3天,但您的代码只返回小时和分钟

    乔达时间 尝试运行自己的日期时间计算通常会带来麻烦和挫折。请查看一个好的日期时间库是否可以帮助您,例如java 8附带的新java.time.*类

    ISO 8601持续时间 日期和时间的国际标准定义了一种处理其所称内容的方法。历史上,该概念也被称为周期。持续时间跟踪以年、月、日、小时和分钟表示的流逝时间的概念

    值以
    PnYnMnDTnHnMnS
    格式表示为字符串。“p”表示持续时间(时段)字符串的开始。“T”表示时间部分。每个数字位于其元素标识符之前。例如,“P3Y6M4DT12H30M5S”表示持续时间“三年六个月四天十二小时三十分钟五秒”

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

    示例代码 下面是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.toString());
    
    当运行时

    start:2013-10-10T11:30:10.000+02:00
    停止时间:2013-10-13T20:55:55.000+02:00
    周期:P3DT9H25M45S
    现在:2013-12-24T01:03:10.029+01:00
    周期2:PT5M
    总计:P3DT9H30M45S
    
    注意
    25M
    如何增加到
    30M

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


    使用“dd/M/yyyy hh:mm:ss“格式不明确。没有理由使用这种格式而不是标准格式。另外,标准格式在按字母顺序排序时提供了时间顺序。

    请不要忘记在问题中添加“?”!有些人在页面中搜索“?”,如果“问题”中不存在,则直接转到下一个(实际)行中有问题。为什么要将HH:mm转换为日期?是否要将其存储为数据库中的“日期”?如果是,请不要这样做,因为它在技术上并不表示日期。它是一个持续时间。时区如何?这些日期时间都是UTC/GMT吗?您的示例日期时间间隔为3天,但您只返回小时和分钟?如果您正在使用va从存储为日期时间值的数据库中获取LUE,为什么您的示例代码要分析字符串?同意。如果您确实必须缓存这些值,请将其存储为
    BIGINT
    计数(毫秒或其他);这将使您更容易对这些值进行计算。如果您想要小时/分钟,请在显示时格式化。