Groovy:如何初始化和比较来自不同时区的日期/时间值?

时间:2012-05-24 09:07:31

标签: datetime groovy

我需要标准化并比较不同时区的日期/时间字段。例如,您如何找到以下两次之间的时差?...

"18-05-2012 09:29:41 +0800"
"18-05-2012 09:29:21 +0900"

使用日期/时间初始化标准变量的最佳方法是什么? 输出需要在时区(例如+0100)中显示差异和标准化数据,该时区与传入值不同且与本地环境不同。

预期产出:

18-05-2012 02:29:41 +0100 
18-05-2012 01:29:21 +0100
Difference: 01:00:20

3 个答案:

答案 0 :(得分:6)

import java.text.SimpleDateFormat

def dates = ["18-05-2012 09:29:41 +0800",
 "18-05-2012 09:29:21 +0900"].collect{
   new SimpleDateFormat("dd-MM-yyyy HH:mm:ss Z").parse(it)
}
def dayDiffFormatter = new SimpleDateFormat("HH:mm:ss")
dayDiffFormatter.setTimeZone(TimeZone.getTimeZone("UTC"))
println dates[0]
println dates[1]
println "Difference "+dayDiffFormatter.format(new Date(dates[0].time-dates[1].time))

哇。看起来不可读,不是吗?

答案 1 :(得分:3)

<强>解决方案:

  1. Groovy / Java Date对象存储为之后的毫秒数 1970年,所以不直接包含任何时区信息
  2. 使用 Date.parse 方法将新日期初始化为指定格式
  3. 使用 SimpleDateFormat 类指定所需的输出格式
  4. 使用 SimpleDateFormat.setTimeZone 指定输出的时区 数据
  5. 通过使用欧洲/伦敦时区而不是GMT,它会 自动调整日光节省时间
  6. 有关日期时间模式选项的完整列表,请参阅here
  7. -

    import java.text.SimpleDateFormat
    import java.text.DateFormat
    
    //Initialise the dates by parsing to the specified format
    Date timeDate1 = new Date().parse("dd-MM-yyyy HH:mm:ss Z","18-05-2012 09:29:41 +0800")
    Date timeDate2 = new Date().parse("dd-MM-yyyy HH:mm:ss Z","18-05-2012 09:29:21 +0900")
    
    DateFormat yearTimeformatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss Z")
    DateFormat dayDifferenceFormatter= new SimpleDateFormat("HH:mm:ss")  //All times differences will be less than a day
    
    // The output should contain the format in UK time (including day light savings if necessary)
    yearTimeformatter.setTimeZone(TimeZone.getTimeZone("Europe/London"))
    
    // Set to UTC. This is to store only the difference so we don't want the formatter making further adjustments
    dayDifferenceFormatter.setTimeZone(TimeZone.getTimeZone("UTC"))
    
    // Calculate difference by first converting to the number of milliseconds
    msDiff = timeDate1.getTime() - timeDate2.getTime()
    Date differenceDate = new Date(msDiff)
    
    println yearTimeformatter.format(timeDate1)
    println yearTimeformatter.format(timeDate2)
    println "Difference " + dayDifferenceFormatter.format(differenceDate)
    

答案 2 :(得分:3)

或者,使用JodaTime包

@Grab( 'joda-time:joda-time:2.1' )
import org.joda.time.*
import org.joda.time.format.*

String a = "18-05-2012 09:29:41 +0800"
String b = "18-05-2012 09:29:21 +0900"

DateTimeFormatter dtf = DateTimeFormat.forPattern( "dd-MM-yyyy HH:mm:ss Z" );

def start = dtf.parseDateTime( a )
def end = dtf.parseDateTime( b )

assert 1 == Hours.hoursBetween( end, start ).hours