存储两个字节的日期

imr*_*ole 3 java binary encoding

我最近看到了有关二进制编码的讨论,给出的示例Date是以两个字节存储Java 对象的日期部分(日,月和年)。我现在正试图从演讲中了解代码片段:

long time = new Date().getTime();  // time in ms since epoch
time /= 86400000; // ms in a day
byte a = (byte)(time >>> 8);
byte b = (byte)(time);
Run Code Online (Sandbox Code Playgroud)

现在,我缺少的是将这两个字节转换回原始日期的日,月和年的方式似乎很“简单”。我也不确定如果我们同时保留原始时间值作为字节,为什么还要使用两个字节。

有人可以解释一下这怎么可能吗?我了解上面的代码在做什么,只是不知道如何还原原始日期。

更新资料

这是谈话,有问题的幻灯片是20/21

http://www.slideshare.net/jtdavies/turn-your-xml-into-binary-java-one-2014

Flo*_*yle 5

以下是从字节恢复日期的方法:

long time = new Date().getTime(); // time in ms since epoch
time /= 86400000; // ms in a day
byte a = (byte) (time >>> 8);
byte b = (byte) (time);

time = a;
time = time << 8;
time = time | b;
time *= 86400000;

System.out.println(new Date(time));
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这并不总是有效,因为由于夏令时闰秒,日子并不总是 86400000 毫秒长。


Old*_*eon 5

假设您的bytes为8位字节,则提供了16位范围或0-65535

天数可以是1-315位。

一个月数可以是1-124位。

这样就留下16-5-4=7了存储年份或范围的位0-127。您可能会假设我们正在讨论,2000因此您可以轻松地将任何日期打包成16位数字。

    int date = ((((y % 100) << 5) + m) << 4) + d;
    int year = 2000 + (date >>> (5 + 4));
    int month = (date >> 4) & 0x1f;
    int day = date & 0xf;
Run Code Online (Sandbox Code Playgroud)

警告-这个想法耗费了世界数十亿(据说)。只是在那时才将其称为y2k错误,然后我们才添加了1900