UTC a AEST

Un usuario Pregunto ✅

ElliotP

Mañana,

La columna DateTime en mi tabla sql está en hora UTC, pero me gustaría que esta columna estuviera en la zona horaria AEST (-10 o -11). He leído bastante en los foros y todas las soluciones no parecen manejar bien el horario de verano; simplemente compensan o +/- duración (compensación menos efectiva).

Me preguntaba si alguien tenía una forma de convertir UTC a AEST de manera confiable teniendo en cuenta el horario de verano o si este es el tipo de cosas que se maneja mejor con un procedimiento almacenado en la tabla sql mientras se usa Data Factory.

Publicación muy útil: https: //community.powerbi.com/t5/Desktop/Convert-utc-to-local-time-zone-using-Power-Query/mp/45533 # …

MarcelBeug

En respuesta a ElliotP

Puede usar la tabla y la función de mi publicación como se ilustra en este video:

steven_steven

Quizás esto pueda ayudar a otros.

He tomado una forma diferente de resolver el horario de verano con el plan de no depender de una tabla (¡tampoco es que haya nada de malo en eso!)

El caso de uso puede ser limitado ya que aborda la conversión de UTC a otra zona horaria con soporte de horario de verano con DST comenzando el segundo domingo de marzo y terminando el primer domingo de noviembre.

Last Refresh Pacific =

  // First let's find the date of the second Sunday of March
  // For the forumla below:
  // In DAX, we use the functions DATE() and WEEKDAY()
  // "1+7*2", generically, "1+7*n" where n represents 
  // the nth occurence of that "weekday name" 
  // "8-1", generically, "8-y", where 
  // y can be a number from 1 to 7, where
  // 1 = Sunday through to 7 = Saturday
  //
  // Thus, the date of the second Sunday of the month
  // is returned to the variable ZZQQ_DST_START
  // 
// ZZQQ_DATE is the date/time in UTC.
VAR ZZQQ_DST_START = DATE(YEAR(ZZQQ_DATE),3,1+7*2) - WEEKDAY(DATE(YEAR(ZZQQ_DATE),3,8-1)) // Next let's find the date of the first Sunday in November VAR ZZQQ_DST_END = DATE(YEAR(ZZQQ_DATE),11,1+7*1) - WEEKDAY(DATE(YEAR(ZZQQ_DATE),11,8-1)) RETURN IF ( // Evaluate if ZZQQ_DATE is between DST start and end // If yes, change time to Pacific Daylight Savings Time // else, change time to Pacific Standard Time (ZZQQ_DATE >= ZZQQ_DST_START) && (ZZQQ_DATE <= ZZQQ_DST_END), ZZQQ_DATE + (-7/24), // If condition matches, convert UTC to PDT ZZQQ_DATE + (-8/24) // Else convert UTC to PST )

RachnaV

En respuesta a steven_steven

@steven_steven

Esto funcionó para mí, estaba buscando una forma de abordar el problema de la zona horaria en el propio DAX sin crear una columna calculada o usar el lenguaje Power Query. Cambié esto un poco para satisfacer mis necesidades y funciona bien.

¿Podría explicar la lógica en las dos líneas siguientes en las que está restando el día de la semana de una fecha, también dónde puedo encontrar la sintaxis de la función de fecha que explica cómo ha utilizado la parte de día de la función de fecha (es decir, 1 + 7 * 2 y 8 -1):

  VAR ZZQQ_DST_START = DATE(YEAR(ZZQQ_DATE),3,1+7*2) 
    - WEEKDAY(DATE(YEAR(ZZQQ_DATE),3,8-1))

  // Next let's find the date of the first Sunday in November 
  VAR ZZQQ_DST_END = DATE(YEAR(ZZQQ_DATE),11,1+7*1) 
    - WEEKDAY(DATE(YEAR(ZZQQ_DATE),11,8-1))

MarcelBeug

¿Y qué pasó con mi respuesta a tu misma pregunta ???? Smiley triste

ElliotP

En respuesta a MarcelBeug

Noche,

Por alguna razón, no vi la publicación emergente hace un tiempo, lo siento mucho. Smiley triste

He echado un vistazo, ¿no estoy seguro de cómo crear ese TimeTable original? Además, el pbix tendrá una configuración regional de Estados Unidos, por lo que puedo convertir la cadena con la que se identifica y almacena mi fecha y hora, en un tipo de datos DateTime.

En respuesta a ElliotP

@ElliotP,

Podemos cambiar la zona horaria cuando agregamos una columna personalizada. Lo he probado en mi entorno local.

Untitled.png Untitled1.png

Capture.PNG

Saludos,

Charlie Liao

MarcelBeug

En respuesta a v-caliao-msft

@ v-caliao-msft su solución no funcionará en este caso ya que no tiene en cuenta los interruptores del horario de verano (DST).

ElliotP

En respuesta a MarcelBeug

Este es el problema que estamos trabajando para resolver.

He visto una solución potencial complicada en radacad (puedo encontrar el enlace si no lo ha visto antes); pero se basa en trabajar con una API externa que parece un poco exagerado.

MarcelBeug

En respuesta a ElliotP

Si elimino mi solución en la otra publicación al mínimo requerido para esta zona horaria específica: necesita una tabla con los interruptores de reloj y una función para la conversión.

Consulta UTCtoAET devuelve una tabla con sellos de fecha y hora UTC entre el 1/1/2010 y el 1/1/2030 en el que los relojes se ajustan en Australia, junto con el desplazamiento después del cambio:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("dZJLDsMgEEOvUrGOxHwITXqVKPe/RlsCEhiz9ZOFxo/rCho1mqi85CMStqAa7u0KKfoTa665lFwlGoBWKLmSggJ4Ch69ACONDKA9UXInhR1AK5Q8kUIC0Aol30nBAQxX59XVeS6U/I2FM7oAGGc6VjMdi5nO1Uwnv9qYawfQfw5jrg1AP5Mx1Qqgn8km1XUmI6r/RxtTvQPo/4Yx1QnAsBJT7QCGlSbVbaVJdT16Mt2OnkzXv2FMdQbwa9xf", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [UTC = _t, UTCOffset = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"UTC", type datetime}, {"UTCOffset", Int64.Type}})
in
    #"Changed Type"

Esto fue creado a través de «Ingresar datos». Puede realizar ajustes si presiona el botón de engranaje directamente desde el paso Fuente en el editor de consultas:

UTC a AEST.png

Función fnUTCtoAET convierte las fechas UTC a AEDT / AEST:

(DateTimeUTC as datetime) as datetime => DateTimeUTC + #duration(0,Table.Last(Table.SelectRows(UTCtoAET, each [UTC] <= DateTimeUTC))[UTCOffset],0,0)

Consulta de ejemplo que convierte algunas fechas UTC a AEDT / AEST:

let
    Source = Table.FromColumns({List.DateTimes(#datetime(2017,6,1,0,0,0),10,#duration(60,0,0,0))},type table[UTC = datetime]),
    #"Invoked Custom Function" = Table.AddColumn(Source, "AEST/AEDT", each fnUTCtoAET([UTC]), type datetime)
in
    #"Invoked Custom Function"

Resultado:

UTC a AEST examples.png

tombradley

En respuesta a MarcelBeug

Hola Marcel,

Gracias por esta publicación … pero ¿puedes explicar cómo ajustar tus instrucciones para diferentes zonas horarias?

Así que cambiando esto …

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("dZJLDsMgEEOvUrGOxHwITXqVKPe/RlsCEhiz9ZOFxo/rCho1mqi85CMStqAa7u0KKfoTa665lFwlGoBWKLmSggJ4Ch69ACONDKA9UXInhR1AK5Q8kUIC0Aol30nBAQxX59XVeS6U/I2FM7oAGGc6VjMdi5nO1Uwnv9qYawfQfw5jrg1AP5Mx1Qqgn8km1XUmI6r/RxtTvQPo/4Yx1QnAsBJT7QCGlSbVbaVJdT16Mt2OnkzXv2FMdQbwa9xf", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [UTC = _t, UTCOffset = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"UTC", type datetime}, {"UTCOffset", Int64.Type}})
in
    #"Changed Type"

para convertir

UTC a GMT / BST … o

UTC a EST / EDT

etcétera etcétera

Muchas gracias,

Tomás

ElliotP

En respuesta a tombradley

Se trata de cambiar la tabla de referencia UTC a AET, ya que especifica las fechas. Debe ingresar las fechas usted mismo manualmente, pero dada la funcionalidad y cómo esta es la única solución en cualquier lugar de la web, vale la pena dedicar 10 minutos a tomar las fechas.

MarcelBeug

En respuesta a ElliotP

Si desea convertir fechas y horas entre zonas horarias, debe crear un archivo de Excel para cada una de esas zonas horarias.

Antes de cada ejecución, debe ajustar la zona horaria en su computadora local. Y cierre y vuelva a abrir el archivo de Excel, si mal no recuerdo.

Para su información, me tomó alrededor de 3 horas para todos los aprox. 130 zonas horarias, digamos 1-2 minutos por zona horaria.

A continuación, debe combinar los archivos en una hoja de Excel separada, como esta:

Tablas de tiempos combinados.png

Esto es solo una combinación simple de los archivos individuales, con los nombres de los archivos como zonas horarias.

(Está bien, agregué punto y coma, pero eso no es realmente necesario).

Finalmente, necesita una función para la conversión real. Esta función calculará primero la fecha y hora UTC a partir de la fecha y hora de origen y, a continuación, calculará la fecha y hora en la zona de destino a partir de la fecha y hora UTC. Las zonas horarias de origen y de destino deben ser los nombres de las zonas de la tabla combinada.

Puedo compartir el código con mi nombre de archivo y tabla.

Desafortunadamente, todo está en holandés (excepto el nombre de la función), pero aún debería funcionar (después de ajustar la fuente a su fuente).

Nota: el código se escribió en diciembre de 2016 y puede que no sea muy eficiente (no estoy seguro). En algún momento en el futuro (¿cercano?), Crearé un nuevo código en inglés, probablemente más eficiente al crear una tabla de calendario grande para cada cuarto de hora, para que los datos se puedan fusionar directamente.

Por ahora, este es el código que puedo compartir:

let
    fnDateTimeBetweenZones = (ZoneFrom as text, DateTimeFrom as datetime, ZoneTo as text) as datetime =>
let
//    ZoneFrom = "(UTC+10:30) Lord Howe Island",
//    DateTimeFrom = DateTime.FixedLocalNow(),
//    ZoneTo = "(UTC-09:00) Alaska",
    Bron = Excel.Workbook(File.Contents("C:UsersMarcelOneDrive - BemintOffice 365Power QueryDateTimeTablesWindows Time and Dates.xlsx"), null, true),
    GlobalTimeTable_Table = Bron{[Item="GlobalTimeTable",Kind="Table"]}[Data],
    #"Type gewijzigd" = Table.TransformColumnTypes(GlobalTimeTable_Table,{{"Tijdzone", type text}, {"UTC", type datetime}, {"Lokaal", type datetime}}),
    #"Gefilterde rijen" = Table.SelectRows(#"Type gewijzigd", each ([Tijdzone] = ZoneFrom)),
    #"Aangepaste kolom toegevoegd" = Table.AddColumn(#"Gefilterde rijen", "DateTimeFrom", each DateTimeFrom),
    #"Aangepaste kolom toegevoegd1" = Table.AddColumn(#"Aangepaste kolom toegevoegd", "Lokaal<=DateTimeFrom", each [Lokaal]<=[DateTimeFrom]),
    #"Gefilterde rijen1" = Table.SelectRows(#"Aangepaste kolom toegevoegd1", each ([#"Lokaal<=DateTimeFrom"] = true)),
    #"Laatste rijen behouden" = Table.LastN(#"Gefilterde rijen1", 1),
    #"Aangepaste kolom toegevoegd2" = Table.AddColumn(#"Laatste rijen behouden", "UTCDatumTijd", each [DateTimeFrom]+([UTC]-[Lokaal])),

/* Nu de UTC-tijd omrekenen naar lokale tijd in ZoneTo */
    #"Gefilterde rijen2" = Table.SelectRows(#"Type gewijzigd", each ([Tijdzone] = ZoneTo)),
    #"Aangepaste kolom toegevoegd3" = Table.AddColumn(#"Gefilterde rijen2", "UTCDatumTijd", each #"Aangepaste kolom toegevoegd2"[UTCDatumTijd]{0}),
    #"Aangepaste kolom toegevoegd4" = Table.AddColumn(#"Aangepaste kolom toegevoegd3", "UTC<=UTCDatumTijd", each [UTC]<=[UTCDatumTijd]),
    #"Gefilterde rijen3" = Table.SelectRows(#"Aangepaste kolom toegevoegd4", each ([#"UTC<=UTCDatumTijd"] = true)),
    #"Laatste rijen behouden1" = Table.LastN(#"Gefilterde rijen3", 1),
    #"Aangepaste kolom toegevoegd5" = Table.AddColumn(#"Laatste rijen behouden1", "DateTimeTo", each [UTCDatumTijd]+([Lokaal]-[UTC])),
    DateTimeTo = #"Aangepaste kolom toegevoegd5"[DateTimeTo]{0}
in
    DateTimeTo
in
    fnDateTimeBetweenZones

ElliotP

En respuesta a MarcelBeug

Esto es increíble y definitivamente debería quedar en suspenso, ya que probablemente sea la primera solución disponible públicamente para este gran problema.

Entonces:

1: Creo una tabla usando la entrada de datos de los últimos años hacia atrás y hacia adelante según lo necesite para los días en que cambia el horario de verano.

2: ¿Crear una función en mi tabla de datos usando la función personalizada y vincular mi tabla de fechas con mi columna AEST generada por la función personalizada?

MarcelBeug

En respuesta a ElliotP

Puede usar la tabla y la función de mi publicación como se ilustra en este video:

ElliotP

En respuesta a MarcelBeug

¿Alguien sabría cómo aumentar las fechas de tiempo de conversión UTC iniciales? Comienzan en 2010, pero esperaba impulsarlos un poco antes (1990).

La conversión inicial parece provenir de una serie de fechas creada

(@MarcelBeug si estás a punto deSmiley feliz)

ElliotP

En respuesta a MarcelBeug

Esto debería estar pegajoso. Esto es realmente asombroso. Muchas gracias @MarcelBeug; Realmente lo aprecio. Usted fue por encima y más allá.

Esta es la mejor y única solución que he visto para este problema y parece haber muchos tipos de soluciones para este problema, pero ninguna puede resolver el problema del horario de verano.

Muchas gracias.

MarcelBeug

En respuesta a MarcelBeug

Siempre es posible converger entre la hora local y la hora UTC, pero entonces depende de la configuración de la zona horaria de su computadora (que también podría ser un servidor que se ejecuta en UTC).

Consulta de ejemplo:

let
    Source = Table.FromColumns({List.DateTimes(#datetime(2017,1,1,1,0,0),10,#duration(25,1,0,0))},type table[UTC = datetime]),
    #"Added Custom" = Table.AddColumn(Source, "Local", each DateTime.From(DateTime.AddZone([UTC],0,0)), type datetime)
in
    #"Added Custom"

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *