【问题标题】:Protocol Buffer: How to define Date type?协议缓冲区:如何定义日期类型?
【发布时间】:2014-11-03 15:08:31
【问题描述】:

我正在尝试编写一个原始文件,该文件的日期字段未定义为协议缓冲区的类型。

我已阅读以下帖子,但无法找到适合我的合适解决方案: What the best ways to use decimals and datetimes with protocol buffers?.

我正在尝试将 proto 文件转换为 java 。

【问题讨论】:

    标签: java protocol-buffers


    【解决方案1】:

    我在链接帖子中的回答主要与 protobuf-net 相关;但是,既然你是从 java 来的,我建议:保持简单。

    对于日期,我建议只使用时间(可能是毫秒)进入一个纪元(1970 年 1 月 1 日是传统的)。有时,只是同一单位的大小(毫秒等)。对于十进制,可以简单地通过缩放使用定点 - 所以可以将 1.05 视为长 1050 并始终准确断言 3dp(因此是定点)。

    这简单实用,涵盖了最常见的场景,而不会使事情变得复杂。

    【讨论】:

    • Thx ...我已经听从了您的建议,并将日期字段表示为“int64”到原始文件中,我会将其转换为日期到我的 java 类中。
    • 这也是我通常做的,从 unix epoch 开始只存储毫秒。
    • 你推荐int64还是fixed64?
    • @ticktock 应该没问题
    【解决方案2】:

    我不赞成这个想法,但我真的不赞成将日期(不是即时的)存储为时间戳的想法,所以这是我的建议。

    将您的日期转换为人类可读的整数(例如,2014-11-3 变为 20141103)并存储此整数值。它包含您需要的数据,易于创建和解析,并且占用的空间最小。此外,它是有序的,并且具有日期到有效值的一对一映射(当然,可能存在无效数字,例如20149999,但这些很容易检测到)。相比之下,每天大约有 86400 个有效时间戳。

    注意:有一个 discussion on DBA SE 批评这种日期存储方法,但在这种情况下,存在一种专门的日期类型,这显然不是这里的情况。

    【讨论】:

    • 当我不知道使用 protobuf、thrift 或 avro 时,我创建了 nimn 数据格式。我为compress dates 创建了一个单独的库,这与您的建议更相似。
    猜你喜欢
    • 2010-09-25
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2011-09-18
    • 2021-12-19
    相关资源
    最近更新 更多