2

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

这是我必须做的:

我有一个将 Avl 数据包发送到我的通信服务器的外部设备,并且我正在进行数据部分的解析过程。

在数据包的某处,设备发送一个 32 位的时间戳,我必须将其解析/翻译成保存 GPS 点记录的时间。

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

现在这是一个示例代码,我觉得它是我在其余实验中尝试过的最接近的示例代码。

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(now);

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

之后我发现 calendar.set 没有创造一个新的纪元,所以 .setTimeInMills 不起作用。虽然我得到了一些疯狂的结果,比如:

二进制时间戳为:0000101011000001010110001111011100001111

秒:46193506063

46193506063000 = 25/10/3433 04:27:43.000

我不应该只是想念 1970 年到 2007 年之间的 37 年吗?

我想找到一种方法来从我从设备获得的秒数中找到时间,但是它们的纪元是 2007 年 1 月 1 日,而 java 的纪元是 1970 年 1 月 1 日。

编辑:我想要的是有时间:2007 年 1 月 1 日加上时间戳的时间。希望我稍微澄清了这个问题..

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

4

4 回答 4

1

看来您想要做的只是将您的now价值添加到Calendar. 这很容易做到:

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()));

编辑

关于你的now变量持有的东西有些奇怪。46193506063 seconds1464.786468258 years应按这个时间转换器

于 2012-09-20T13:49:32.223 回答
1

假设您在 long 变量中读取输入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);

我没有测试它,但它应该给你的想法。另请注意,我没有考虑时区。

于 2012-09-20T14:09:57.687 回答
0

最简单的做法是在设置时间以毫秒为单位后使用Calendarroll()的方法:

calendar.roll(Calendar.YEAR, 37)--> 只需将您的日期增加 37 年 ;-)

但我认为您的输入数据是错误的:如果您计算自 2007 年 1 月 1 日到现在为止的秒数,它应该是大约 2 亿,而不是像您的示例中那样的 400 亿......

于 2012-09-20T14:17:13.597 回答
0

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

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

If their epoch is in seconds, change the last MILISECOND to SECOND.

于 2012-09-20T14:20:28.470 回答