Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.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 1989年12月31日上午12:00后的秒数_Java_Date_Garmin - Fatal编程技术网

Java 1989年12月31日上午12:00后的秒数

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

从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解析器中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中没有未签名的


Morover
Date
的此构造函数已过时,因此使用
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
vs
int
正如其他人提到的,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