2012-06-15 6 views
0

Я пытался решить эту проблему в течение прошедшего дня и не могу найти более элегантный (стиль Groovy), надеюсь, что кто-то может мне помочь.Список замены замещения и изменения часового пояса

В основном у меня есть список, содержащий временные метки (GMT-0), поступающие из внешнего источника, которые необходимо преобразовать в указанный часовой пояс (в данном случае Paris GMT + 2), а затем заменить оригинальные отметки времени в список с новым временем (GMT + 2) в формате эпохи.

Примечание: Я попытался использовать GregorianCalendar, но не смог определить, как установить временную зону ввода (GMT-0), чтобы я мог преобразовать вмененное время в любой часовой пояс.

Это мое уродливое решение:

 
def tStamp= ['2012-06-14T20:16:20Z', '2012-06-14T20:16:40Z', '2012-06-14T20:17:00Z', '2012-06-14T20:17:20Z', '2012-06-14T20:17:40Z', '2012-06-14T20:18:00Z'] 
println "Ext: "+ tStamp 
tStamp = tStamp.collect { 7200+(new Date().parse("yyyy-MM-dd'T'HH:mm:ss'Z'", it).time.toString().toLong()/1000).toInteger() } 
println "New: "+ tStamp 

Ext: [2012-06-14T20:16:20Z, 2012-06-14T20:16:40Z, 2012-06-14T20:17:00Z, 2012-06-14T20:17:20Z, 2012-06-14T20:17:40Z, 2012-06-14T20:18:00Z] 
New: [1339704980, 1339705000, 1339705020, 1339705040, 1339705060, 1339705080] 

Новая версия:

def timeStamps =['2012-06-18T09:11:00Z', '2012-06-18T09:11:20Z', '2012-06-18T09:11:40Z'] 
println "ORIG: "+ timeStamps 

// Import the external time: GMT-0 
def inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") 
inputFormat.timeZone = TimeZone.getTimeZone('GMT-0') 
timeStamps = timeStamps.collect { inputFormat.parse(it) } 
println "IN: "+ timeStamps 

// Convert the timez to GMT+2 and conver to epoch 
timeStamps = timeStamps.collect { def gcal = new GregorianCalendar(TimeZone.getTimeZone("GMT+2")); gcal.setTime(it); return gcal.getTimeInMillis()/1000 } 
println "OUT: "+ timeStamps 

ORIG: [2012-06-18T09:11:00Z, 2012-06-18T09:11:20Z, 2012-06-18T09:11:40Z] 
IN: [Mon Jun 18 11:11:00 CEST 2012, Mon Jun 18 11:11:20 CEST 2012, Mon Jun 18 11:11:40 CEST 2012] 
OUT: [1340010660, 1340010680, 1340010700] 

Кто-нибудь есть какие-либо предложения?

С наилучшими пожеланиями и спасибо заранее,

Sebastian

ответ

0

Я, наконец, нашли решение этой проблемы:

import java.text.SimpleDateFormat 
    def convertTimeZone(String time, String sourceTZ, String destTZ) { 
    final String DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'" 
    def sdf = new SimpleDateFormat(DATE_TIME_FORMAT) 
    Date specifiedTime 

    try { 
     if (sourceTZ != null){ 
     sdf.setTimeZone(TimeZone.getTimeZone(sourceTZ)) 
     }else{ 
     sdf.setTimeZone(TimeZone.getDefault()) // default to server's timezone 
     } 
     specifiedTime = sdf.parse(time) 
    } catch (Exception e1){ 
     try { 
     specifiedTime = new Date().parse(DATE_TIME_FORMAT, time) 
     } catch (Exception e2) { 
     return time 
     } 
    } 
    // switch timezone 
    if (destTZ != null){ 
     sdf.setTimeZone(TimeZone.getTimeZone(destTZ)) 
    }else{ 
     sdf.setTimeZone(TimeZone.getDefault()) // default to server's timezone 
    } 

    new Date().parse("yyyy-MM-dd'T'HH:mm:ss'Z'", sdf.format(specifiedTime)) 
    } 

def timeStamps = ['2012-06-14T20:16:20Z', '2012-06-14T20:16:40Z'] 

println "IN: "+ timeStamps 
timeStamps = timeStamps.collect { ((convertTimeZone(it,"GMT-0","Europe/Paris")).time.toString().toLong()/1000).toInteger() } 
println "OUT: "+ timeStamps 

Выход:

IN: [2012-06-14T20:16:20Z, 2012-06-14T20:16:40Z] 
OUT: [1339712180, 1339712200] 

Надеюсь, что это решение также поможет кому-то еще.

1

Вы можете использовать SimpleDateFormat для разбора и форматирования дат. Обратите внимание, что объекты Date не знают ничего о часовых поясах, поэтому при работе с объектами Date вам обычно не нужно беспокоиться об этих вещах, а затем их разборять из строк или форматировать их в строки.

import java.text.SimpleDateFormat 

def timeStamps = ['2012-06-14T20:16:20Z', '2012-06-14T20:16:40Z'] 

def inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") 
inputFormat.timeZone = TimeZone.getTimeZone('GMT-0') 

// Once parsed, dates are agnostic to time zones. 
def dates = timeStamps.collect { inputFormat.parse(it) } 

def outputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z") 
outputFormat.timeZone = TimeZone.getTimeZone('GMT+2') 

println "Dates in current locale: " + dates 
println "Dates in GMT+2 time zone: " + dates.collect { outputFormat.format(it) } 

Выход:

Dates in current locale: [Thu Jun 14 17:16:20 ART 2012, Thu Jun 14 17:16:40 ART 2012] 
Dates in GMT+2 time zone: [2012-06-14T22:16:20 +0200, 2012-06-14T22:16:40 +0200] 

Обратите внимание, что в первой строке, даты печатаются с текущей локалью (который GMT-3 на моей машине ... поэтому есть 3 часа разницы между ними и датами ввода GMT-0).

Конечно, вам не нужно промежуточный dates список, вы можете сразу сделать:

timeStamps.collect { outputFormat.format(inputFormat.parse(it)) } 
+0

Спасибо за ответ. С вашей помощью мне удалось правильно ввести временную метку, но теперь, как я могу преобразовать ее в формат эпохи в GMT + 2. Я пробовал это (см. Пост-обновление), но не учитывая часовой пояс. Есть ли у вас предложения? – syepes

+0

@syepes извините, я не знаю. Я не слишком опытен со всеми сложностями на сегодняшний день; у меня создалось впечатление, что время в миллисекундах было относительно абсолютной даты и что это не зависело от часового пояса или чего-то подобного. – epidemian