3

我必须计算从 1989 年 12 月 31 日凌晨 12:00 到现在的秒数。第二个解析器来自 Garmin Fleet Management。这是我的代码:

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 位整数,其值是自 1989 年 12 月 31 日上午 12:00(UTC)以来的秒数。

我在哪里做错了?

4

5 回答 5

2

您应该返回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中没有unsigned


Morover 这个构造函数Date已经过时了,所以使用 ofCalendar是更好的方法:

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);
}
于 2016-03-25T12:14:30.307 回答
2

您应该使用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格式(current year value - 1900)。通过Javadoc

  • @param year 减去 1900 的年份。
    • @param month 0-11 之间的月份。
    • @param date 1-31 之间的月份日期。
    • @see java.util.Calendar
    • @deprecated 从 JDK 1.1 版开始,
    • 取而代之Calendar.set(year + 1900, month, date)
    • GregorianCalendar(year + 1900, month, date)

您也应该使用( Javalong中没有)返回值unsigned int

于 2016-03-25T12:16:19.263 回答
1

您正在使用已弃用的 API。年份参数不是直接年份,而是从 1900 年开始的年份。

@Deprecated public Date(int year, int month, int date, int hrs, int min) 已弃用。从 JDK 版本 1.1 开始,替换为 Calendar.set(year + 1900, month, date, hrs, min) 或 GregorianCalendar(year + 1900, month, date, hrs, min)。分配一个 Date 对象并对其进行初始化,以便它表示本地时区中由年、月、日、小时和分钟参数指定的分钟开始处的瞬间。参数: year - 年份减去 1900。

于 2016-03-25T12:19:00.850 回答
1
于 2016-03-26T00:25:39.143 回答
0

我也偶然发现了 Garmin 的问题,我认为您的日期弄错了:“1989 年 12 月 31 日上午 12:00”是从 30 日到 31 日的午夜,或者用军事术语来说是 31 日的“零百小时”和 0:00h 为世界其他地方!你有它作为中午时间!

本次参考来自“ Garmin Device Interface Specification, May 19, 2006, Drawing Number: 001-00063-00 Rev. C ”,其中写道:

7.3.14 时间类型

time_type 在某些数据结构中用于指示绝对时间。它是一个无符号的 32 位整数,其值是自 1989 年 12 月 31 日 12:00 UTC 以来的秒数。

我不确定这是 Garmin 特有的,还是典型的 GPS 设备时间问题,因为 GPS 时间分别计算闰秒。至少在 Garmin 记录中,UTC 时间需要从以下位置构建:1. 上述参考日期 2. 闰秒(2018 年 = 18) 3. 拖曳(从周日 0:00h 开始以秒为单位的一周时间) 4. 和wn_days(周数天)

总的来说,我的 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 时间。

于 2018-02-22T15:18:32.467 回答