Scala解析一个非常长的字符串作为日期

时间:2017-08-09 14:49:30

标签: java scala date parsing

我将以下字符串作为CSV文件的一部分

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

如果存在,可以处理此格式的日期模式是什么? 我使用以下以及其他变体

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

但都失败了:

  

java.text.ParseException:Unparseable date

2 个答案:

答案 0 :(得分:1)

我假设1:0offset from UTC(在这种情况下,相当于+01:00)。

SimpleDateFormat API中,无法识别此格式,因为它只接受HH:MM格式的偏移(小时和分钟均为2位数)。可能你必须单独解析并手动添加偏移量。

我可以找到解决方案,但它仅适用于Java 8的new java.time API

对于 Java< = 7 ,有ThreeTen Backport,但我不确定它对Scala的效果如何。

我使用java.time.format.DateTimeFormatterBuilder和带偏移量自定义值的地图:当分钟和秒数为零时,我使用H:M格式的值(如1:0),对于其他值,我使用正常偏移(如+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())

答案 1 :(得分: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