【问题标题】:String to Long in JavaJava中的字符串到长
【发布时间】:2018-08-03 09:16:10
【问题描述】:

我的要求:

我在 EpochMillis 中获得价值

public void Method(){
    //long val = epoch time in millis
    //Format the (val)epochtime in MMddHHmmss and set ZoneOffset.UTC
    //long formattedTime = formatted time;
    obj.setTime(formattedTime);
}

最终目标是获取上述格式的格式化时间,结果应该是“long”类型

我可以处理预期的数据,但结果是 String,在转换回 Long 时,前导零会丢失。 (我想将长度保留为 10 - 根据格式)

有人可以帮忙吗?

我在下面尝试过

final long timeInMillis = Instant.now().toEpochMilli();`
final Instant instant = Instant.ofEpochMilli(Long.valueOf(timeInMillis));`
final String formattedDate = DateTimeFormatter.ofPattern("MMddHHmmss").withZone(ZoneOffset.UTC).format(instant);

这里我只能得到字符串,我希望是格式化​​的 long(长度为 10)

编辑1: 或者我需要任何其他想法。 我需要使用仅接受 Long 值的 Setter 方法设置时间,例如 0803072816 [MM-dd-HH-mm-ss]。 以毫秒为单位的长而无需格式化也可以 格式化程序长值或未格式化时间(以毫秒为单位),在这两种情况下,长度都应该正好 = 10

【问题讨论】:

  • 我不明白。您是想得到一个最后带有前导零(不可能)的long 变量,还是带有前导零的格式化字符串?
  • 前导零不是数学数字的一部分。它是装饰,因此只存在于String 之类的表示中。使用 formatter 显示带有前导零的数字。如果要解析前导零并记住它们,请使用自定义解析器。如前所述,数字本身没有前导零,因此它们丢失
  • 您的对象不应该使用long 作为日期和时间。就像您不应该使用 int 来保存字符或使用 char 来保存数字一样。这是错误的,它必然会混淆并且容易导致错误。使用来自java.time, the modern Java date and time API 的日期时间类,例如Instant。然后在需要显示时将其格式化为适合用户的字符串。

标签: java time java-8 java.time.instant


【解决方案1】:

所以你有类似的东西

String s = "0128115900";
long n = Long.parse(s, 10); // 128115900L
String t = String.format("%010d", n); // "0128115900"

在大多数编程语言中,数字没有固定的 0 填充宽度,只有在 SQL 中有一个宽度,用于“存储”。

还有——顺便说一句——:

long n = 0128115900L; // Error, octal number with digits 0-7

实际上意味着别的:前面的 0 导致数字以 8 为基数,其中每个数字代表 3 位,就像前面的 0x 如果是基数 16。

回顾一下:

long/int 始终没有宽度属性,可以假定前面有任何零,但它的 toString() 字符串表示形式给出了最短的版本。

要接收某个宽度的字符串表示,在输出点使用String.format("%010d", n) / System.out.printf("%010d%n", n)

【讨论】:

    【解决方案2】:

    对于计算机,像00012(在内存中)这样的长数字与12 相同。它不关心前导 0。

    只要我知道你不是电脑。所以你读的不是计算机编号,而是这个数字的视觉表示。 此表示是一个字符串,可以有前导 0。

    无论您如何处理 long 值,省略前导 0 是完全正常的。 获得这些 0 的唯一方法是在需要显示时使用字符串格式化程序。

    例如:String.format("%010d", myNumber)

    编辑:我写了“00012(在内存中)”,以免将它与字符串 "00012"long 的转换混淆,这是数字 10 的八进制表示

    【讨论】:

    • It doesn't care about leading 0 我明白你的意思,但这可能会造成混淆,因为在代码中编写这样的数字会将其解析为八进制数。
    • 谢谢,我添加了一个注释
    【解决方案3】:

    您不能,因为 long 没有前导零。 long 应该存储整数(数学概念,而不是 int)。

    像05这样的字符串不是整数,5是。您可以做的是在打印时格式化一个带有前导零的 5 的 long 格式,参见例如java.util.Formatter。

    你确定你甚至想要一个长整数/整数吗?你想用它做什么? 复制自: Parse String to long with leading zero

    【讨论】:

      【解决方案4】:

      long 永远无法被格式化。只有String 可以被格式化。你可以通过Long.parseLong 方法轻松地将字符串解析为long,如果你需要它的long 值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-03
        • 1970-01-01
        • 2010-12-25
        • 2011-07-23
        • 2014-10-06
        • 1970-01-01
        相关资源
        最近更新 更多