在Scala中将时间(无日期)转换为UTC时间

时间:2013-12-06 20:52:24

标签: scala

我有一段时间需要解析当前的12小时时钟格式。一些例子如下:

  • 11:30 PM
  • 07:00 AM

这些时间目前在东部时区。将这些字符串转换为包含UTC等效字符串的字符串的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

怎么样:

import java.text.SimpleDateFormat

val fmtFromLocal = new SimpleDateFormat("hh:mm a z") // z parses time zone
val fmtToGmt = new SimpleDateFormat("hh:mm a")

def toGmt(t: String): String = fmtToGmt.format(fmtFromLocal.parse(s + " EST"))

不幸的是,当本地时区不是GMT时,这会失败,因为.parse()返回本地时间。

修正:

import java.text.SimpleDateFormat
import java.util.{Date, TimeZone}

val localTz = TimeZone.getDefault()
val currentOffset = localTz.getOffset(System.currentTimeMillis)
val fmtFromLocal = new SimpleDateFormat("hh:mm a z") // z parses time zone
val fmtToGmt = new SimpleDateFormat("hh:mm a")
def toGmt(t: String): String = {
  val time = fmtFromLocal.parse(t).getTime()
  val timeUtc = time + currentOffset
  fmtToGmt.format(new Date(timeUtc))
}

(未经测试)

答案 1 :(得分:0)

使用Joda-Time

val tz = DateTimeZone.forTimeZone(TimeZone.getTimeZone("EST"))  
// You can also use DateTimeZone.forID(), but it requires an id in form
// like 'Europe/Paris', but I don't remember which such ID corresponds to Eastern time
val fmt = DateTimeFormat.forPattern("hh:mm a")
val fmtIn = fmt.withZone(tz)
val fmtOut = fmt.withZone(DateTimeZone.UTC)

val strIn = "11:30 PM"
val strOut = fmtOut.print(fmtIn.parseDateTime(strIn))

简单明了。我收到04:40 AM 11:30 PM,这似乎是正确的,而且我在UTC + 4区域,所以这个方法在本地时区独立工作。