将时间戳编码为最少的字符

Posted

技术标签:

【中文标题】将时间戳编码为最少的字符【英文标题】:Encoding a timestamp to the least amount of characters 【发布时间】:2014-07-21 04:59:53 【问题描述】:

我需要创建一个条形码,其中包含除其他数据外的时间戳,包括年、月、日、小时和分钟。鉴于代码长度有限,我需要此时间戳尽可能短。

我的想法是获取 UNIX 时间戳,除以 60(删除“秒”数据),然后将其转换为十六进制。示例:

当前时间戳:1401546126 丢秒:1401546126 / 60 = 23359102 转换为十六进制:0x1646E7E 打印到条形码的字符串:1646E7E

这样我可以从 10 个字符变为 7 个字符。我还考虑过使用不同的基数,例如基数 36,它只能产生 5 个字符。

有没有更好的方法来做到这一点,这可能会导致条形码中的字符更少?除了转换到更高的基数之外,还有其他方法可以解决这个问题吗?

【问题讨论】:

用什么语言?这是一个不错的问题,但这是一个编程网站,因此您需要为您将使用的语言提供一些上下文。 嗯,任何语言。这是一个编程逻辑的问题。我正在尝试找到一种算法来编码时间戳,而不是特定语言的实现。 我明白你的意思。我可能会使用不止一种语言,所以我添加了一个C 标签,因为这些语言是C 派生的。 你在考虑什么样的条码编码方案?许多商业标准(即:五中二编码,en.wikipedia.org/wiki/Two-out-of-five_code)仅表示十进制数字[0-9] 和一些额外的符号。您也可以使用代码 39 或代码 93 编码,但这些通常涉及固定宽度的数字表示,因此除非您超出限制,否则保存数字毫无意义。您能告诉我们您将使用哪种 2D(离散或连续)编码吗? en.wikipedia.org/wiki/Barcode 值必须是唯一的多长时间?如果它在 2 年内结束,这是一个问题吗? 20? 200? 2000?这在很大程度上控制了您需要支持的值的范围。然后目标代码集是另一个问题——你不得不用十六进制编码浪费了一大笔积蓄。 【参考方案1】:

定义您想要支持的最短时间,并计算自该时间以来的分钟数,并按照您的建议减少秒数。在代码支持的基础中对该值进行编码,例如代码 39 的基数为 43。该代码中的 5 个字符可让您表示近 280 年(43^5 分钟)的时间跨度。

【讨论】:

“一个无符号的二补二进制数”?嗯 - 不能是 unsigned “补码”。 @owlstead:分钟数的编码无关紧要(二进制或非二进制),它是一个需要编码的抽象数字,例如基数 43。 这是一个有趣的方法。我会考虑使用它。谢谢。

以上是关于将时间戳编码为最少的字符的主要内容,如果未能解决你的问题,请参考以下文章

将基于十进制列的时间戳转换为实际时间戳时,使用 HH24MISS 扩展“格式字符串”的问题

Spark:考虑夏令时将 GMT 时间戳转换为东部时间

将时间戳格式转换为字符的问题

如何将字符串转换为带有时区的时间戳?

将 Unix 时间戳转换为日期字符串

请帮助将字符串转换为蜂巢中的时间戳