Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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-根据具有不同历元的外部设备的时间戳计算时间_Java_Date_Calendar_Timestamp_Epoch - Fatal编程技术网

Java-根据具有不同历元的外部设备的时间戳计算时间

Java-根据具有不同历元的外部设备的时间戳计算时间,java,date,calendar,timestamp,epoch,Java,Date,Calendar,Timestamp,Epoch,所以我对Java中的日历/时间/日期有点陌生,但我在网上读了很多关于它们的东西 以下是我必须做的: 我有一个外部设备,它向我的通信服务器发送一个Avl数据包,我正在对数据部分进行解析 在数据包的某个地方,设备发送了一个32位的时间戳,我必须将其解析/转换为保存GPS点记录的时间 时间戳给出了从UTC 2007.01.01 00:00开始的秒数 下面是一个示例代码,我觉得这是我在其他实验中尝试的最接近的一个 DateFormat格式化程序=新的SimpleDataFormat(“dd/MM/yyy

所以我对Java中的日历/时间/日期有点陌生,但我在网上读了很多关于它们的东西

以下是我必须做的:

我有一个外部设备,它向我的通信服务器发送一个Avl数据包,我正在对数据部分进行解析

在数据包的某个地方,设备发送了一个32位的时间戳,我必须将其解析/转换为保存GPS点记录的时间

时间戳给出了从UTC 2007.01.01 00:00开始的秒数

下面是一个示例代码,我觉得这是我在其他实验中尝试的最接近的一个

DateFormat格式化程序=新的SimpleDataFormat(“dd/MM/yyyy hh:MM:ss.SSS”)

之后,我发现calendar.set无法创造新纪元,因此.setTimeInMills无法工作。尽管我得到了一些疯狂的结果,如:

二进制时间戳为:00001010101100001011000111100001111

秒:46193506063

46193506063000=25/10/343304:27:43.000

难道我不应该错过1970年到2007年之间的37年吗

我想找到一种从设备上获得的秒数来计算时间的方法,但是他们有2007年1月1日的历元,java有1970年1月1日的历元

编辑:我想要的是时间:2007年1月1日加上时间戳的时间。希望我能澄清一下这个问题

有人有什么想法吗??
Thx提前

您现在要做的似乎只是将您的
值添加到
日历中
。这很容易做到:

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss.SSS");

long now = (long)(TimeStampSeconds.longValue() * 1000);

Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(2007, 0, 1);
calendar.setTimeInMillis(calendar.getTimeInMillis() + now);

System.out.println(now + " = " + formatter.format(calendar.getTime()));
编辑


您的
变量现在包含的内容有些奇怪<代码>46193506063秒
对应于
1464.786468258年
根据

假设您在
timestamp
长变量中读取输入,我会执行以下操作:

Calendar theirEpoch = Calendar.getInstance();
theirEpoch.set(2007, 0, 1);
Calendar myEpoch = Calendar.getInstance();
myEpoch.set(1970, 0, 1);
long difference = myEpoch.getTimeInMillis() - theirEpoch.getTimeInMillis();
Calendar result = Calendar.getInstance();
result.setTimeInMillis(timestamp + difference);

我没有测试它,但它应该给你一个想法。还要注意,我没有考虑时区。

最简单的方法是在设置时间(毫秒)后使用日历的
roll()
方法:

calendar.roll(calendar.YEAR,37)
-->


但我认为你的输入数据是错误的:如果你计算从2007年1月1日到现在的秒数,应该是2亿秒,而不是像你的例子中那样的400亿秒……

这是做你想做的事情的正确方法:

Calendar cal = Calendar.getInstance();
cal.set(2007, 1, 1, 0 ,0 ,0);
cal.set(Calendar.MILLISECOND, 0);
cal.add(Calendar.MILLISECOND, theirEpoch);

如果他们的时间单位是秒,请将最后一毫秒改为秒。

@CipherDarkness:我误解了这个问题。更新以(希望)回答真正的问题。这样做会给我当前时间加上时间戳的时间。我想要的是时间:2007年1月1日加上时间戳的时间。希望我能澄清一下这个问题。@CipherDarkness:我的代码就是这么做的。您确定
now
变量包含您认为它的功能吗?@CipherDarkness:添加了更多信息。此代码错误,请参阅我的答案以获得最短(且正确)的答案。无符号32位值可以容纳的最大值为40亿,但您的数字为460亿。你能检查一下你的号码是对的吗?天哪,你是对的!给出的代码中确实有一个bug!它用了5个字节而不是4..我有一个来自设备手册的示例,它是:11011111110011101110000=29334960秒,从2007.01.01 00:00 29334960秒=2007.12.06 12:36:00 UTC我尝试了给定的数字,并给出了正确的日期!所以我从数据中提取了正确的位……好吧,我的错。但无论如何:手册示例中的秒数比输入数据示例中的秒数少1000秒。你的手册上说你得到的时间是以秒为单位的,但我认为它实际上是以毫秒为单位的……代码上确实有一个错误,新的数字是180443383,它工作正常。谢谢你的时间!:)我确实明白了这个想法,尽管它已经奏效了,但还是非常感谢你的时间!事实上,我意识到减法是没有用的:00:00:00 1/1/1970的定义是0。虽然有一点变化,但这段代码也是正确的。你必须将月份设置为0,因为这是一年的第一个月。我确实改为最后一秒,我相信cal.set(Calendar.millis秒,0);不需要,因为时间戳中不需要毫秒。总而言之,这确实是一种更快的方法,使用int而不是long。谢谢您的时间!
Calendar cal = Calendar.getInstance();
cal.set(2007, 1, 1, 0 ,0 ,0);
cal.set(Calendar.MILLISECOND, 0);
cal.add(Calendar.MILLISECOND, theirEpoch);