Java 1989年12月31日上午12:00后的秒数
从1989年12月31日凌晨12点到现在,我必须计算秒数。 第二个解析器来自Garmin车队管理。 这是我的密码:Java 1989年12月31日上午12:00后的秒数,java,date,garmin,Java,Date,Garmin,从1989年12月31日凌晨12点到现在,我必须计算秒数。 第二个解析器来自Garmin车队管理。 这是我的密码: public int getDate(){ Date d1 = new Date(1989, 12, 31, 12, 0, 0); Date today = new Date(); long diff = today.getTime() - d1.getTime(); return (int)(diff/1000); } Garmin解析器中get
public int getDate(){
Date d1 = new Date(1989, 12, 31, 12, 0, 0);
Date today = new Date();
long diff = today.getTime() - d1.getTime();
return (int)(diff/1000);
}
Garmin解析器中getDate()的秒数显示为2021年7月28日晚上8:35,而不是现在
下面是我需要的(通过文档)日期时间
它是一个无符号32位整数,其值是自UTC 1989年12月31日上午12:00起的秒数
我哪里出错了 您应该返回
long
并将差异包装到Math.abs()
,以获得表示差异的肯定结果
public static long getDate() {
Date d1 = new Date(1989, 12, 31, 12, 0, 0);
Date today = new Date();
long diff = Math.abs(today.getTime() - d1.getTime());
return (diff/1000);
}
Java中没有未签名的
MoroverDate
的此构造函数已过时,因此使用Calendar
是更好的方法:
public static long getDate() {
Calendar d1 = new GregorianCalendar(1989, 11, 31, 0, 0, 0);
Date today = new Date();
long diff = Math.abs(today.getTime() - d1.getTime().getTime());
return (diff/1000);
}
您应该使用Calendar
实例,而不是Date
哪个构造函数已被弃用:
public static long getDate(){
Calendar calendar = new GregorianCalendar(1989, 11, 31, 0, 0, 0);
Date today = new Date();
long diff = today.getTime() - calendar.getTime().getTime();
return diff / 1000;
}
Date
构造函数接受year
作为(当前年份值-1900)
格式。通过Javadoc
:
- @参数年份减去1900的年份。
- @param month 0-11之间的月份
- @参数日期1-31之间的月份日期
- @请参阅java.util.Calendar
- @从JDK 1.1版起已弃用
- 替换为
Calendar.set(年+1900,月,日)
- 或
gregorianalendar(年+1900,月,日)
另外,您应该使用long
(Java中没有unsigned int
)返回值您使用的是不推荐使用的API。年份参数不是直接的年份,而是从1900年开始的年数
@不赞成
公开日期(国际年),
整月,
国际日期,
国际小时,
整数(分钟)
不赞成。从JDK版本1.1起,由Calendar.set(年+1900,月,日,小时,分钟)或GregorianCalendar(年+1900,月,日,小时,分钟)代替。
分配日期对象并对其进行初始化,使其表示本地时区中由年、月、日期、小时和分钟参数指定的分钟开始的时刻。
参数:
年份-减去1900年的年份。tl;博士
细节
其他答案使用过时的类
java.time
Java8及更高版本附带了内置的框架。取代了旧的麻烦的日期时间类,如java.util.date
和.Calendar
long
vsint
正如其他人提到的,Java没有无符号整数——只有有符号整数。因此,这里我们使用64位长
而不是32位int
。Java8允许您对int
值执行一些操作,同时假装它们是无符号的,但实际上我们没有无符号的int
类型。请参阅另一个问题,了解更多信息,包括为库(如Google Guava)中的无符号整数设计的几个类
Instant
在java.time中,是中时间线上的一个时刻。A表示总秒数加上几分之一秒(纳秒)的时间跨度
一天中的第一刻
不确定“1989年12月31日上午12:00 UTC”是指一天中的第一个时刻(00:00:00.0
)还是一天的结束。我将以第一时间为准。事实上,据推测Garmin于2004-09-16年发布的这份PDF文件指出:
7.3.14时间类型
时间类型在某些数据结构中用于表示绝对时间。它是一个无符号32位整数,其值是自1989年12月31日上午12:00 UTC以来的秒数
代码
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*
类
从哪里获得java.time类
- 然后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(我也遇到了Garmin问题,我认为你在日期上犯了一个错误:“1989年12月31日上午12:00”是从30日到31日的午夜,或者用军事术语来说是31日的“零百小时”,对世界其他地方是0:00!你把它作为中午时间
本次参考来自“Garmin设备接口规范,2006年5月19日,图纸编号:001-00063-00 Rev.C”,其中说明:
7.3.14时间类型
time_类型在某些数据结构中用于表示绝对时间。它是一个无符号32位整数及其值
是自UTC 1989年12月31日上午12:00起的秒数
我不确定这是特定于Garmin的,还是典型的GPS设备时间问题,因为GPS时间单独计算,例如闰秒。至少在Garmin记录中,UTC时间需要从以下内容构建:
1.上述参考日期
2.闰秒数(2018年=18)
3.牵引(从周日0:00h开始的一周时间,以秒为单位)
4.和wn_天数(周数天)
总之,我的Python3结构是:
tref = time.mktime((1989, 12, 31, 0, 0, 0, 0, 0, -1))
tsec = tref + wn_days * 86400. + tow - leap_scnds
pvttime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(tsec))
# result: e.g. 2018-02-22 15:09:49 UTC
这为我提供了正确的UTC时间。这不是一个很好的解决方案。您的Date()构造函数已被弃用。而且您使用的是本地时区而不是UTC。这会更好
Instant garminEpoch = Instant.parse( "1989-12-31T00:00:00Z" );
Instant now = Instant.now();
Duration duration = Duration.between( garminEpoch , now );
long seconds = duration.getSeconds(); // This span of time as a total number of seconds.
tref = time.mktime((1989, 12, 31, 0, 0, 0, 0, 0, -1))
tsec = tref + wn_days * 86400. + tow - leap_scnds
pvttime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(tsec))
# result: e.g. 2018-02-22 15:09:49 UTC