1

我的要求:

我在 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);
}

最终目标是以上述格式获取格式化时间,结果应为“长”类型

我可以处理预期的数据,但结果是字符串,在转换回长时,前导零会丢失。(我想将长度保留为 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);

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

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

4

4 回答 4

3

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

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

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

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

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

于 2018-08-03T09:31:14.447 回答
2

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

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

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

于 2018-08-03T09:32:48.220 回答
2

所以你有类似的东西

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).

于 2018-08-03T09:48:51.987 回答
0

long永远无法格式化。只有可以格式化。如果需要它的值,可以通过方法轻松String解析字符串。longLong.parseLonglong

于 2018-08-03T09:36:20.017 回答