Estoy usando date-fns para analizar algunas cadenas similares a fechas en fechas, luego volver a convertirlas en una cadena, así. Mis pruebas unitarias locales están pasando, pero en Jenkins CICD, mis pruebas unitarias fallan. Estoy bastante seguro de que se debe a que la máquina Jenkins está en GMT+0, mientras que yo estoy en una zona horaria GMT+8. Los resultados de las pruebas fallidas en Jenkins lo respaldan, ya que los valores recibidos están 8 horas por detrás de los valores esperados.
import { format } from 'date-fns'; function stringToTime(date: string) { const newDate = new Date(date); return format(newDate, 'k:mm'); // this returns a string }Y mis pruebas unitarias:
const sampleText = 'Mon Aug 02 2021 22:00:15 GMT+0800'; const expectedText = '22:00'; expect(stringToTime(sampleText)).toEqual(expectedText); // this passes locally En mi Jenkins CICD, recibo 14:00 en su lugar. ¿Es este un problema común, y cuál es una forma rápida de arreglar mis pruebas unitarias para que pueda pasar a Jenkins?
Siempre he tenido problemas para usar los constructores de fechas al pasar una cadena de tiempo. Intente usar parseISO de date-fns fns como parseISO(date) en lugar de new Date(date) .
Además, debe importar desde 'date-fns/tmz' para pasar la información de la zona horaria. De esa manera, puede asegurarse de que las zonas horarias sean consistentes y analizadas. aquí hay un ejemplo de los documentos: https://date-fns.org/v2.28.0/docs/Time-Zones
const { zonedTimeToUtc, utcToZonedTime, format } = require('date-fns-tz') // Set the date to "2018-09-01T16:01:36.386Z" const utcDate = zonedTimeToUtc('2018-09-01 18:01:36.386', 'Europe/Berlin') // Obtain a Date instance that will render the equivalent Berlin time for the UTC date const date = new Date('2018-09-01T16:01:36.386Z') const timeZone = 'Europe/Berlin' const zonedDate = utcToZonedTime(date, timeZone) // zonedDate could be used to initialize a date picker or display the formatted local date/time // Set the output to "1.9.2018 18:01:36.386 GMT+02:00 (CEST)" const pattern = 'dMyyyy HH:mm:ss.SSS \'GMT\' XXX (z)' const output = format(zonedDate, pattern, { timeZone: 'Europe/Berlin' })