Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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_Time_Timezone - Fatal编程技术网

Java 从差分/减去两个时段(时间为负数)创建新日期

Java 从差分/减去两个时段(时间为负数)创建新日期,java,date,time,timezone,Java,Date,Time,Timezone,我想减去2个日期并保存差异: SimpleDateFormat formatter = new SimpleDateFormat("HH:mm"); Date a = formatter.parse("08:06"); Date b = formatter.parse("08:00"); Date asd = new Date(a.getTime() - b.getTime()); 问题是asd不是00:06,而是01:06(1970年1月1日星期四01:06:00 CET),我认为这取决于

我想减去2个日期并保存差异:

SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
Date a = formatter.parse("08:06");
Date b = formatter.parse("08:00");
Date asd =  new Date(a.getTime() - b.getTime());
问题是asd不是00:06,而是01:06(1970年1月1日星期四01:06:00 CET),我认为这取决于时区。但我该如何解决这个问题呢?我应该更改jvm时区吗?

请注意

分配一个
Date
对象并初始化它以表示指定的 自标准基准时间(称为“基准时间”)起的毫秒数 “纪元”,即1970年1月1日00:00:00 GMT

这不是间歇

提供了一个类来执行此类计算。Java8在发布时也应该有

long difference = a.getTime() - b.getTime();
int hours = (int) (difference / 3600000);
int minutes = (int) (difference % 3600000 / 60000);
String formatted = String.format("%02d:%02d", hours, minutes);
分配一个
Date
对象并初始化它以表示指定的 自标准基准时间(称为“基准时间”)起的毫秒数 “纪元”,即1970年1月1日00:00:00 GMT

这不是间歇

提供了一个类来执行此类计算。Java 8在推出时也应该具有相同的性能。

时间跨度
long difference = a.getTime() - b.getTime();
int hours = (int) (difference / 3600000);
int minutes = (int) (difference % 3600000 / 60000);
String formatted = String.format("%02d:%02d", hours, minutes);
你的问题不清楚。显然你想在一段时间内工作。为此,您肯定需要库(或新内置的)

乔达时间 Joda Time针对不同的时间跨度提供3门课程:


  • 表示沿时间线的一对开始-停止点。示例:
    2013-01-01T00:00:00.000-05:00/2013-01-04T18:00:00.000-05:00

  • 以毫秒为单位的时间长度。与时间线无关

  • 以若干字段表示跨度,例如年、月、周、日、小时、分钟、秒和毫秒
ISO 8601 该标准定义了合理的文本格式,以表示日期时间值的各个方面。Joda Time(以及Java8中的java.Time)使用ISO8601作为默认值

特别是,ISO 8601定义了一种格式(Joda Time称之为时段†)。值以
PnYnMnDTnHnMnS
格式表示为字符串。“P”表示持续时间(期间)字符串的开始。“T”表示时间部分。每个数字位于其元素指示符之前。例如,“P3Y6M4DT12H30M5S”表示“三年六个月四天十二小时三十分钟五秒”的持续时间

示例代码 转储到控制台

System.out.println( "a: " + a );
System.out.println( "b: " + b );
System.out.println( "period: " + period );
System.out.println( "millis: " + millis );
当运行时

a:2014-01-02T08:06:00.000+01:00
b:2014-01-02T08:00:00.000+01:00
期间:PT-6M
米利斯:-360000
更多信息 在StackOverflow中搜索“joda”和这三个类名中的一个可以找到许多示例


†与时间相关的术语在用法和含义上差异很大。一项新的标准提案已经开始使这些条款正常化。但是,现在,要习惯在切换上下文时必须“翻译”术语。

你的问题不清楚。显然你想在一段时间内工作。为此,您肯定需要库(或新内置的)

乔达时间 Joda Time针对不同的时间跨度提供3门课程:


  • 表示沿时间线的一对开始-停止点。示例:
    2013-01-01T00:00:00.000-05:00/2013-01-04T18:00:00.000-05:00

  • 以毫秒为单位的时间长度。与时间线无关

  • 以若干字段表示跨度,例如年、月、周、日、小时、分钟、秒和毫秒
ISO 8601 该标准定义了合理的文本格式,以表示日期时间值的各个方面。Joda Time(以及Java8中的java.Time)使用ISO8601作为默认值

特别是,ISO 8601定义了一种格式(Joda Time称之为时段†)。值以
PnYnMnDTnHnMnS
格式表示为字符串。“P”表示持续时间(期间)字符串的开始。“T”表示时间部分。每个数字位于其元素指示符之前。例如,“P3Y6M4DT12H30M5S”表示“三年六个月四天十二小时三十分钟五秒”的持续时间

示例代码 转储到控制台

System.out.println( "a: " + a );
System.out.println( "b: " + b );
System.out.println( "period: " + period );
System.out.println( "millis: " + millis );
当运行时

a:2014-01-02T08:06:00.000+01:00
b:2014-01-02T08:00:00.000+01:00
期间:PT-6M
米利斯:-360000
更多信息 在StackOverflow中搜索“joda”和这三个类名中的一个可以找到许多示例



†与时间相关的术语在用法和含义上差异很大。一项新的标准提案已经开始使这些条款正常化。但是,现在,要习惯在切换上下文时必须“翻译”术语。

感谢您的所有解决方案,它将对我的下一个项目有用

但是我不需要Joda里面的所有东西,我只需要一些轻量级的东西来计算和减去时间(并且有负时间),所以我花了几分钟创建自己的类来处理时间

自由地使用这个:

public class Time {

    private int hours;
    private int minutes;
    private long totalMinutes;

    public Time()
    {
        hours = 0;
        minutes = 0;
        totalMinutes = 0;
    }

    public Time(String time) throws RuntimeException
    {
        try
        {
            String[] items = time.split(":");
            this.hours = Integer.parseInt(items[0]);
            this.minutes = Integer.parseInt(items[1]);
            this.totalMinutes = hours*60+minutes;
        }
        catch (RuntimeException re)
        {
            throw new RuntimeException("Parsing time error", re);
        }
    }

    public Time(Time time)
    {
        this.hours = time.hours;
        this.minutes = time.minutes;
        this.totalMinutes = time.totalMinutes;
    }

    public Time add(Time val)
    {
        Time ret = new Time(this);
        ret.totalMinutes += val.totalMinutes;
        ret.hours = (int) Math.abs( (long)ret.totalMinutes/60 );
        ret.minutes = (int) Math.abs( (long)ret.totalMinutes%60 );
        return ret;
    }

    public Time sub(Time val)
    {
        Time ret = new Time(this);
        ret.totalMinutes -= val.totalMinutes;
        ret.hours = (int) Math.abs( (long)ret.totalMinutes/60 );
        ret.minutes = (int) Math.abs( (long)ret.totalMinutes%60 );
        return ret;
    }

    public int getHours() {
        return hours;
    }

    public void setHours(int hours) {
        this.hours = hours;
    }

    public int getMinutes() {
        return minutes;
    }

    public void setMinutes(int minutes) {
        this.minutes = minutes;
    }

    @Override
    public String toString() 
    {
        StringBuilder tmpHHmm = new StringBuilder("" + hours);
        if (totalMinutes<0)
        {
            tmpHHmm.insert(0, "-");
        }
        if (hours<10)
        {
            tmpHHmm.insert(tmpHHmm.length()-1, "0");
        }
        tmpHHmm.append(":"+minutes);
        if (minutes<10)
        {
            tmpHHmm.insert(tmpHHmm.length()-1, "0");
        }
        return tmpHHmm.toString();
    }

    public long getTotalMinutes() {
        return totalMinutes;
    }

    public void setTotalMinutes(long totalMinutes) {
        this.totalMinutes = totalMinutes;
    }

}
公共课时间{
私人整数小时;
私人整数分钟;
私人长分钟;
公共时间()
{
小时=0;
分钟=0;
总分钟数=0;
}
公共时间(字符串时间)引发RuntimeException
{
尝试
{
String[]items=time.split(“:”);
this.hours=Integer.parseInt(项[0]);
this.minutes=Integer.parseInt(项目[1]);
this.totalMinutes=小时*60+分钟;
}
捕获(运行时异常re)
{
抛出新的运行时异常(“解析时错误”,re);
}
}
公共时间(时间)
{
this.hours=time.hours;
this.minutes=time.minutes;
this.totalMinutes=time.totalMinutes;
}
公共时间添加(时间值)
{
Time ret=新时间(本次);
ret.totalMinutes+=val.totalMinutes;
ret.hours=(int)Math.abs((long)ret.totalMinutes/60);
ret.minutes=(int)Math.abs((long)ret.totalMinutes%60);
返回ret;
}
公共时间分段(时间值)
{
Time ret=新时间(本次);
ret.totalMinutes-=val.totalMinutes;