Замена списка на месте и преобразование часового пояса

Я пытался решить эту проблему в течение последнего дня и не могу найти более элегантного (в стиле 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]

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

С уважением и заранее спасибо,

Себастьян


person syepes    schedule 15.06.2012    source источник


Ответы (2)


Вы можете использовать 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 ... поэтому разница между ними и введенными датами GMT-0 составляет 3 часа).

Конечно, вам не нужен промежуточный список dates, вы можете напрямую:

timeStamps.collect { outputFormat.format(inputFormat.parse(it)) }
person epidemian    schedule 15.06.2012
comment
Спасибо за ответ. С вашей помощью мне удалось правильно ввести метку времени, но теперь как я могу преобразовать ее в формат эпохи в GMT + 2. Я пробовал это (см. Сообщение об обновлении), но не учитывая часовой пояс. Есть ли у вас какие-либо предложения? - person syepes; 18.06.2012
comment
@syepes извините, я не знаю. Я не слишком разбираюсь во всех тонкостях свиданий; У меня создалось впечатление, что время в миллисекундах было относительно абсолютной даты и не зависело от часового пояса или чего-то подобного. - person epidemian; 18.06.2012

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

  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]

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

person syepes    schedule 19.06.2012