我从日期选取器中选取了一个日期,从当前系统时间中选取了另一个日期。当我想减去其中一个是2000年之前的日期时,我得到了一些关于年份的无效答案。我该怎么解决?
public class Duration {
private int year,month,day,hour,min,seconds;
public Duration(long endTime, long startTime){
Calendar calendar1=new GregorianCalendar();
calendar1.setTimeInMillis(endTime);
Calendar calendar=new GregorianCalendar();
calendar.setTimeInMillis(startTime);
this.year=calendar1.get(Calendar.YEAR)-calendar.get(Calendar.YEAR);
this.month=calendar1.get(Calendar.MONTH)-calendar.get(Calendar.MONTH);
this.day=calendar1.get(Calendar.DAY_OF_MONTH)-calendar.get(Calendar.DAY_OF_MONTH);
this.hour=calendar1.get(Calendar.HOUR)-calendar.get(Calendar.HOUR);
this.min=calendar1.get(Calendar.MINUTE)-calendar.get(Calendar.MINUTE);
this.seconds=calendar1.get(Calendar.SECOND)-calendar.get(Calendar.SECOND);
System.out.println(toString());
}
public int getDay() {
return day;
}
public int getHour() {
return hour;
}
public int getMin() {
return min;
}
public int getMonth() {
return month;
}
public int getSeconds() {
return seconds;
}
public int getYear() {
return year;
}
@Override
public String toString() {
return year+" "+month+" "+day+" "+hour+" "+min+" "+seconds;
}
}
当我想从当前时间中减去1998年1月2日的某个日期时,我得到以下结果:
-1879 1 3 10 24 34
年份不正确。
3条答案
按热度按时间tquggr8v1#
您将获得长格式的天数。也可以参考马克·拜尔斯的回答。
kxeu7u2r2#
热释光;博士
请在ideone.com上查看此代码的实时运行。
1998-10-31
避免遗留日期时间类
从不使用
Calendar
或者Date
班级。这些糟糕的类在几年前被java.time类所取代。本地日期
这个
LocalDate
类表示一个仅限日期的值,不包含一天中的时间,也不包含时区或utc的偏移量。时区是决定日期的关键。在任何一个特定的时刻,世界各地的日期因地区而异。例如,在法国巴黎,午夜过后几分钟是新的一天,而在蒙特勒仍然是“昨天”é阿尔曲é贝克。
如果未指定时区,jvm将隐式应用其当前默认时区。在运行时(!)期间,该默认值可能随时更改,所以你的结果可能会有所不同。最好将所需/预期时区显式指定为参数。
以以下格式指定正确的时区名称
Continent/Region
,例如America/Montreal
,Africa/Casablanca
,或Pacific/Auckland
. 切勿使用2-4个字母的缩写,例如EST
或者IST
因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。如果您想使用jvm的当前默认时区,那么请求它并将其作为参数传递。如果省略,代码将变得模棱两可,我们无法确定您是否打算使用默认值,或者您是否像许多程序员一样不知道这个问题。
或指定日期。你可以用数字来设定月份,1-12月份的数字是1-12。
或者,最好使用
Month
枚举预定义对象,一年中每个月一个。小贴士:用这些Month
对象,而不是一个整数,以使代码更加自我记录,确保有效值,并提供类型安全。同上Year
&YearMonth
.期间
要以年、月、日表示时间跨度,请使用
Period
.日期时间数学
通过调用
plus…
以及minus…
方法。持续时间
如果要用天(24小时的时间块,与日历无关)、小时、分钟、秒和分秒来表示时间跨度,请使用
Duration
.年
你的问题不清楚,但好像是2000年的事。当年的java.time类没有什么特别之处。
您可以查询java.time类的年份值。
关于java.time
java.time框架内置于Java8及更高版本中。这些类取代了旧的遗留日期时间类,例如
java.util.Date
,Calendar
, &SimpleDateFormat
.现在处于维护模式的joda time项目建议迁移到java.time类。
要了解更多信息,请参阅oracle教程。和搜索堆栈溢出的许多例子和解释。规格为jsr 310。
您可以直接与数据库交换java.time对象。使用符合jdbc 4.2或更高版本的jdbc驱动程序。不需要线,不需要线
java.sql.*
班级。从哪里获得java.time类?
JavaSE8、JavaSE9、JavaSE10、JavaSE11及更高版本—标准JavaAPI的一部分,带有捆绑实现。
Java9添加了一些次要的特性和修复。
java se 6和java se 7
大部分java.time功能都是通过三个十个后端口后端口移植到Java6和Java7的。
安卓
android包java.time类的更高版本实现。
对于早期的android(<26),threetenabp项目采用了threeten backport(如上所述)。了解如何使用threetenabp…。
threeten额外的项目用额外的类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如
Interval
,YearWeek
,YearQuarter
,等等。jmp7cifd3#
方法:1
方法:2
减去两个日期,然后将差值相加
Calendar
对象并从其对象中检索年份值。