【问题标题】:Timestamp convert [duplicate]时间戳转换[重复]
【发布时间】:2020-03-01 12:10:20
【问题描述】:

我下面的函数不会将日期转换为定义的格式。

  val oldFormat= new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSSSSS")
  val newFormat= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSSSSS",Locale.ENGLISH)
  newFormat.format(oldFormat.parse(s).getTime))

输入日期格式为yyyy-MM-dd-HH.mm.ss.SSSSSS,需要转换成yyyy-MM-dd hh:mm:ss.SSSSSS。

我的输入是 2019-10-08-03.57.1​​4.694695 但上面的代码输出到 2019-10-08 04:15:04.000695 我在这里做错了什么

【问题讨论】:

  • 我不仅始终建议您不要使用SimpleDateFormatDate。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。 SimpleDateFormat 也没有办法做你想做的事。而是使用来自java.time, the modern Java date and time APILocalDateTimeDateTimeFormatter

标签: java apache-spark timestamp


【解决方案1】:

使用 Java 8 中引入的较新的 DatetimeFormatterLocalDateTime API:

import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import java.util.*


fun main(args: Array<String>){

    val oldFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS")
    val localDateTime = LocalDateTime.parse("2019-10-08-03.57.14.694695", oldFormatter)
    val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS", Locale.ENGLISH)
    val output = formatter.format(localDateTime)
    println(output)

}

我创建了一个自定义格式化程序并获得了我使用不同的自定义格式化程序再次重新格式化的日期对象。

【讨论】:

  • 我同意,使用 java 8 中引入的较新的 DatetimeFormatter 和 LocalDateTime api,我创建了一个自定义格式化程序并获得了我使用不同的自定义格式化程序再次格式化的日期对象
【解决方案2】:

使用 Java 8

String InputFormat = "yyyy-MM-dd-HH.mm.ss.SSSSSS";
String outputFormat = "yyyy-MM-dd HH:mm:ss.SSSSSS";

String input = "2019-10-08-03.57.14.694695";

LocalDateTime ldt = LocalDateTime.parse(input, DateTimeFormatter.ofPattern(InputFormat));

String result = DateTimeFormatter.ofPattern(outputFormat).format(ldt);
System.out.println(result);

如果您仍想使用 SimpleDateFormat,解决方法如下使用@tutejszy 回答

String input = "2019-10-08-03.57.14.694695";

String microseconds = input.substring(input.lastIndexOf('.')+1);
int ms= Integer.parseInt(microseconds);

input= input.substring(0,input.lastIndexOf('.')+1) + "000000";

SimpleDateFormat in = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSSSSS");

String result = new SimpleDateFormat("yyyy-MM-dd
HH:mm:ss.").format(in.parse(input))
+ String.format("%06d", ms%1000000);

System.out.println(result);

【讨论】:

    【解决方案3】:

    https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html。 S - 它的毫秒数,这意味着最大值为 999。如果你写 S 超过 3 次,它只会添加前导零。

    但是你可以使用 java.time 其中 S 的第二部分:

        final String input = "2019-10-08-03.57.14.694695";
        final TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS").parse(input);
        final DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss.SSSSSS", Locale.ENGLISH);
        final String result = newFormatter.format(ta);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 2021-01-04
      • 1970-01-01
      • 2014-06-26
      • 2014-04-11
      • 2018-09-12
      相关资源
      最近更新 更多