Convertir fecha a diferente zona horaria + cambio de formato

Convertir fecha a diferente zona horaria + cambio de formato

Tengo un archivo de registro con marcas de tiempo en el formato "22.09.2016 08:22:54" ("+%Y:%m:%d %H:%M:%S"). Esta marca de tiempo está en la zona horaria UTC.

Ahora tengo que convertir esta marca de tiempo a la marca de tiempo de Europa/Helsinki usando un script bash.

Tengo este script que realiza la conversión como quiero.

#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "2015-05-20 18:05:02")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"

Esto funciona bien, pero el formato de "entrada" de fecha ( -d "2015-05-20 18:05:02" ) es un formato diferente en comparación con el formato de marca de tiempo de mi registro.

Me gustaría cambiar este script a algo como esto...

#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "$1")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"

Donde el $1 puede estar en el formato de fecha original de mi archivo de registro "22.09.2016 08:22:54" ("+%Y:%m:%d %H:%M:%S").

No puedo hacer que esto funcione. ¿Alguien puede ayudarme con esto? Gracias.

EDITAR:

He probado algo como esto y muchas otras combinaciones.

#!/bin/sh 
sec=$(TZ="UTC" date +'%s' "+%Y:%m:%d %H:%M:%S" -d "$1") 
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S" 

pero termina con un error.

date: extra operand ‘+%Y:%m:%d %H:%M:%S’ 
Try 'date --help' for more information. 
date: invalid date ‘@’ 

Respuesta1

no parecedateadmite una cadena de formato de entrada. Como tal, no podrá simplemente seguir adelante y pasar la cadena hasta la fecha. La página de manual indica que acepta los formatos habituales, por lo que tal vez su configuración local pueda influir en esto, pero no estoy seguro de eso.

Más información, echemos un vistazo a su script:

#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "$1")
$(TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S")

Lo que sucede aquí es que convierte el $1parámetro a una marca de tiempo de Linux y luego lo convierte nuevamente en la cadena que desee. Un posible enfoque para hacer que esto funcione con su entrada sería reformatear el $1parámetro de cadena.

Podrías hacer esto como ejemplo usando seduna expresión regular adecuada. Tenga en cuenta que debe asegurarse de tener una cadena válida de antemano y que cualquier cambio de formato podría romperla.

#!/bin/bash
intputdate=$(echo $1 | sed -re 's/([0-9]{2})\.([0-9]{2})\.([0-9]{4})/\3-\2-\1/')
sec=$(TZ="UTC" date +'%s' -d "$intputdate")
echo $(TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S")

Editar: No tener nombres de variables incorrectos ciertamente ayuda.

Respuesta2

Esto se ve un poco mejor, convirtiendo la hora de Nueva Zelanda a la hora de Mónaco:

TZ="Europa/Mónaco" fecha --date="TZ=\"Pacífico/Auckland\" 2017-10-11 00:51" +%Y-%m-%d\ %H:%M:%S

2017-10-10 13:51:00

#!/bin/bash
new_zealand_time="2017-10-12 00:56"
monaco_time=$(TZ="Europe/Monaco" date --date="TZ=\"Pacific/Auckland\" $new_zealand_time" +%Y-%m-%d\ %H:%M:%S)
echo "Time in Monaco: $monaco_time"

Hora en Mónaco: 2017-10-11 13:56:00

Respuesta3

En MacOS (10.14.3) funciona bastante bien ya que puedes proporcionar el formato exacto mediante -fel interruptor:

$ d1="22.09.2016 08:22:54"
$ sec=$(TZ="UTC" date -j -f "%d.%m.%Y %H:%M:%S" "$d1" "+%s")
1474532574
$ TZ="Europe/Helsinki" date -j -f "%s" "$sec" "+%Y:%m:%d %H:%M:%S"
2016:09:22 11:22:54

y, por cierto, su formato de registro es "+%d.%m.%Y %H:%M:%S", no "+%Y:%m:%d %H:%M:%S"como lo indica después del segundo fragmento de código; de lo contrario, la línea donde secse define en mi código anterior probablemente arrojará illegal time formatun error o algo así.

información relacionada