首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用两个字节存储日期

用两个字节存储日期
EN

Stack Overflow用户
提问于 2015-03-13 13:55:43
回答 5查看 4.7K关注 0票数 3

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

代码语言:javascript
运行
复制
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);

现在我忽略的一点是,将这两个字节转换回原来日期的日期、月份和年份显然是“简单”的。我也不知道为什么我们使用两个字节,如果我们保留原来的时间值作为一个字节。

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

更新

这是我们的演讲,问题是20/21

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

EN

回答 5

Stack Overflow用户

发布于 2015-03-13 14:08:47

下面是如何从字节中还原日期:

代码语言:javascript
运行
复制
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));

但是,不幸的是,由于日光节约闰秒的原因,这并不总是有效的,因为白天并不总是86400000毫秒长。

票数 5
EN

Stack Overflow用户

发布于 2015-03-13 14:11:37

假设您的byte是8位字节,那么这就提供了一个16位范围或0-65535

一个天数可以是1-31,可以容纳5位。

一个月数可以是1-12,可以容纳4位。

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

代码语言:javascript
运行
复制
    int date = ((((y % 100) << 5) + m) << 4) + d;
    int year = 2000 + (date >>> (5 + 4));
    int month = (date >> 4) & 0x1f;
    int day = date & 0xf;

请注意-这是一个花费全世界数十亿美元(据称)的想法。它被称为y2k错误,那时候我们只添加了1900

票数 5
EN

Stack Overflow用户

发布于 2015-03-13 14:09:40

如果有两个字节( ab ),您可以按照如下方式重构原始时间戳:

代码语言:javascript
运行
复制
public static Date reconstructFromBytes(byte a, byte b) {
    long timestampRecovered = (a << 8);
    timestampRecovered += b;
    timestampRecovered *= 86400000;

    return new Date(timestampRecovered);
}

正如一位评论者所说,这假设一天有8640万毫秒。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29034085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档