【问题标题】:Java: convert date string to charactersJava:将日期字符串转换为字符
【发布时间】:2018-10-30 09:01:26
【问题描述】:

我正在寻找一种将格式化日期转换为 Java 字符的方法。

String fdate = DateTimeFormatter
            .ofPattern("yyyyMMddHHmmssSSS")
            .withZone(ZoneId.of("UTC"))
            .format(
                Instant.now(Clock.systemUTC()));

这给了我一个类似的 17 个字符的字符串,仅由数字组成。我想将数字“转换”为字符,例如十六进制但使用所有字符,以缩短日期(实际上我需要生成具有最少字符的唯一 ID...客户约束)。

这会让我喜欢:

Z5G1BJ9F...

接下来我不需要能够转换回“普通”字符串。只允许使用常用字符 [1-9a-zA-Z]。

有简单的方法吗?

谢谢。

【问题讨论】:

  • 您是否考虑过只使用 UNIX 时间戳?它可能比您建议的更短,但更容易使用。
  • 是的,我想将其应用于时间戳。从 Instant 我可以得到 epochMilli(长)和纳秒(int),我也想将两者“编码”为字符
  • 那么问题是什么?只需将该数字转换为基数 36。
  • 提示:如果您的目标是创建一个通用唯一标识符,只需使用 universally unique identifier (UUID)。原始版本 1 UUID 结合了当前时刻、一个 MAC 地址、一个任意递增的数字和一些其他位,以确定一个 128 位的值。不要重新发明轮子。

标签: java string date character


【解决方案1】:

yyyyMMddHHmmssSSS 格式的日期可能仍会导致 ID 重复。

要生成具有最少字符的唯一 id,请使用数据库序列来生成下一个数字(或使用文件自行实现)。如果您的序列从 1 开始并增加 1,您将不会得到更短的唯一编号。

如果您的约束是使用[1-9a-zA-Z] 字符,您可以应用Base58 或类似的编码。不幸的是,Base64 使用 +/ 和可能的 =,因此它不符合您的要求。 Base58 的示例实现可以在BitcoinJ project 中找到:

BigInteger bi = BigInteger.valueOf(3471844090L);
assertEquals("16Ho7Hs", Base58.encode(bi.toByteArray()));

【讨论】:

  • 谢谢,正是我所期待的
猜你喜欢
  • 2016-09-07
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 2015-04-27
相关资源
最近更新 更多