2017-08-09 52 views
0

我有以下字符串作爲一個CSV文件的一部分斯卡拉解析一個很長的字符串作爲日期

2014-01-30 12:15:00.3 1:0 

什麼是如果有的話,可以處理這種格式的日期模式? 我使用連同其他變化

val inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss+'Z'") 

以下但都失敗:

java.text.ParseException:無法解析的日期

+0

爲'1:0'的[UTC的偏移量(https://en.wikipedia.org/wiki/UTC_offset)(所以它等同於'+01:00')? – 2017-08-09 17:15:28

回答

0

什麼是應該是在1:0結束?這是爲我工作:

val input = "2014-01-30 12:15:00.3 1:0" 
val inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") 

val output = inputFormat.parse(input) 
println(output) // Thu Jan 30 12:15:00 EST 2014 

如果您有您的格式Z因爲你想UTC,那麼這樣做:

val input = "2014-01-30 12:15:00.3 1:0" 
val inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") 
inputFormat.setTimeZone(TimeZone.getTimeZone("UTC")) // Add this line to set the timezone 

val output = inputFormat.parse(input) 
println(output) // Thu Jan 30 07:15:00 EST 2014 
1

我假設1:0offset from UTC(在這種情況下, ,相當於+01:00)。

SimpleDateFormat API中,無法識別此格式,因爲它只接受格式爲HH:MM(兩位數小時和分鐘)的偏移量。可能你必須分別解析它並手動添加偏移量。

我能找到一個解決方案,但它只適用於Java 8的new java.time API

對於的Java < = 7,還有的ThreeTen Backport,但我不知道它有多好作品使用Scala。

我使用java.time.format.DateTimeFormatterBuilder和用於自定義值的映射的偏移:當分秒都爲零,我使用的值的格式H:M(如1:0),以及用於其他值I使用正常偏移(如+01:30)。 您可以將其更改爲您的應用程序收到的任何格式。

import java.time._ 
import java.time.format._ 
import java.time.temporal._ 

import collection.JavaConversions._ 
import collection.mutable._ 

val input = "2014-01-30 12:15:00.3 1:0"; 
// build a map with custom offset values 
// +01:00 becomes 1:0 
// when minutes and seconds are not zero, use the default values (like +01:01, +01:30, etc) 
var map: java.util.Map[java.lang.Long, String] = HashMap[java.lang.Long, String]() 
var i = ZoneOffset.MIN.getTotalSeconds() 
while (i <= ZoneOffset.MAX.getTotalSeconds()) { 
    var seconds = i 
    var hours = seconds/3600 
    seconds -= (hours * 3600) 
    var minutes = seconds/60 
    seconds -= (minutes * 60) 
    if (seconds == 0 && minutes == 0) { 
    // minutes and seconds are zero, +01:00 becomes 1:0 
    map.put(i, Integer.toString(hours).concat(":0")) 
    } else { 
    // minutes and seconds are not zero, use the default values (like +01:01, +01:30, etc) 
    var id: String = ZoneOffset.ofTotalSeconds(i).getId() 
    map.put(i, id) 
    } 
    i += 1 
} 
val parser = new DateTimeFormatterBuilder() 
    // date and time 
    .appendPattern("yyyy-MM-dd HH:mm:ss.S ") 
    // offset, with custom values 
    .appendText(ChronoField.OFFSET_SECONDS, map) 
    // create formatter 
    .toFormatter() 
// parse the input 
val odt = OffsetDateTime.parse(input, parser) 
// convert to java.util.Date 
var date = new java.util.Date(odt.toInstant().toEpochMilli()) 
// another way of doing it 
date = java.util.Date.from(odt.toInstant())