格式化yyyy-MM-dd HH:mm:ss from String to date格式

时间:2017-01-25 20:41:08

标签: scala apache-spark datetime-format

我遇到的情况非常奇怪。

我的代码:

   val aa = "2017-01-17 01:33:00"
    val bb = "04:33"
    val hour = bb.substring(0, bb.indexOf(":"))
    val mins = bb.substring(bb.indexOf(":") + 1, bb.length())
    val negatedmins = "-" + mins
    val ecoffsethour = hour.toLong
    val ecoffsetmins = negatedmins.toLong
    println(aa)
    val datetimeformatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
    val txn_post_date_hkt_date_parsed = LocalDateTime.parse(aa, datetimeformatter)
    println(txn_post_date_hkt_date_parsed)
    val minushours = txn_post_date_hkt_date_parsed.minusHours(ecoffsethour)
    println(minushours)
    val minusmins = minushours.minusMinutes(ecoffsetmins)
    println(minusmins)
    val offsetPostdateDiff = minusmins.toString().replace("T", " ")
    println(offsetPostdateDiff)

输出:

2017-01-17 01:33:00
2017-01-17T01:33
2017-01-16T21:33
2017-01-16T22:06
2017-01-16 22:06

在相同的代码中,我只将“aa”值更改为==> 2017-01-17 01:33:44

现在输出是:

2017-01-17 01:33:44
2017-01-17T01:33:44
2017-01-16T21:33:44
2017-01-16T22:06:44
2017-01-16 22:06:44

为什么第一种方法不考虑秒字段?

  

我的要求是:但是输出应该是“yyyy-MM-dd”   HH:mm:ss“格式。

我对Scala很新。请赐教。

2 个答案:

答案 0 :(得分:1)

默认格式为ISO 8601

在解析/生成字符串以表示日期时间值时,java.time类默认使用标准ISO 8601格式。

本地日期时间的标准格式是您在中间T看到的内容:YYYY-MM-DDTHH:MM:SS.SSSSSSSSS

LocalDateTime ldt = LocalDateTime.now( ZoneId.of( "America/Montreal" ) ) ;
String output = ldt.toString() ;
  

2017-01-23T12:34:56.789

您的电话println( txn_post_date_hkt_date_parsed )隐式调用toString对象上的内置LocalDateTime方法,从而要求标准ISO 8601格式为T。< / p>

println( txn_post_date_hkt_date_parsed.toString() )

偏移

在一个不相关的说明中,你工作太辛苦了。 java.time类处理偏移量。我不明白为什么你想要这样一个奇数(四小时三十三分钟)的偏移量,但也是如此。

以下是您修改的代码,但是使用的是Java语法。

String input = "2017-01-17 01:33:00" ;

DateTimeFormatter f = DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
OffsetDateTime utc = ldt.atOffset( ZoneOffset.UTC ) ;

ZoneOffset offset = ZoneOffset.of( "-04:33" ) ;  // Behind UTC by four hours and thirty-three minutes.
OffsetDateTime odt = utc.withOffsetSameInstant( offset ) ;

您可以看到此code run live at IdeOne.com。请注意wall-clock timeoffset-from-UTC在上一个日期的情况。历史上的同一时刻,时间轴上的相同点,但通过两个不同的挂钟时间(UTC,并且落后4小时三十三分钟)观察。

最后的Z是标准的ISO 8601表示法,是Zulu的缩写,表示UTC。

  

输入:2017-01-17 01:33:00

     

ldt.toString():2017-01-17T01:33

     

utc.toString():2017-01-17T01:33Z

     

odt.toString():2017-01-16T21:00-04:33

答案 1 :(得分:0)

通常最好明确要输出的格式。

所以,而不是

println datetime

您可以这样做:

println datetimeformat.print(datetime)
祝你好运!

编辑:进行更改以使2个表达式完全等效