java - Scala 将很长的字符串解析为日期

标签 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

最佳答案

我假设 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())

关于java - Scala 将很长的字符串解析为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45594031/

相关文章:

java - 将 List 传递给 Set Constructor,过滤是否按顺序进行?

java - 矩阵加法java

每周星期一和星期六日期的 PHP 日期问题

java - 服务器启动时MyEclipse 2015 WebSphere 6.1 'Multiple problems have occurred'

java - mvn Sonar :sonar throwing error

scala - 我们可以使用 Akka 和 Camel 集成来实现 REST 服务吗?

scala - 如何以编程方式调用 Scala 编译器?

scala - 使用 SBT 将源文件复制到目标目录

JSF 页面错误地反射(reflect)了日期 - 1 天偏移

python - Pandas - Python,删除基于日期列的行