Java 从差分/减去两个时段(时间为负数)创建新日期
我想减去2个日期并保存差异: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),我认为这取决于
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
以毫秒为单位的时间长度。与时间线无关
以若干字段表示跨度,例如年、月、周、日、小时、分钟、秒和毫秒
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
以毫秒为单位的时间长度。与时间线无关
以若干字段表示跨度,例如年、月、周、日、小时、分钟、秒和毫秒
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;