дата форматирования, не зависящая от часового пояса-fns

#javascript #date-fns

#javascript #дата-fns

Вопрос:

В настоящее время я использую date-fns серверную часть для добавления метаданных к определенным записям перед сохранением в БД:

 function getDateFormat(serverMillisTimestamp) {
  const current_unix = Math.round(serverMillisTimestamp / 1000)
  return {
    year: format(fromUnixTime(current_unix), 'yyyy').toString(),
    monthOfYear: format(fromUnixTime(current_unix), 'MMMM')
      .toString()
      .toLowerCase(),
    isoWeekOfYear: format(fromUnixTime(current_unix), 'II').toString(),
    dayOfMonth: format(fromUnixTime(current_unix), 'dd').toString(),
    isoDayOfWeek: format(fromUnixTime(current_unix), 'iiii')
        .toString()
        .toLowerCase()
  }
}
 

однако на стороне клиента, когда я использую тот же код для генерации year, monthofYear, isoWeekOfYear, DayOfMonth и isoDayOfWeek, чтобы я мог запрашивать записи из базы данных, возникает несоответствие, поскольку формат использует часовой пояс locale для получения этих значений.

Как я могу использовать date-fns , чтобы форматированные значения не зависели от часового пояса?

Комментарии:

1. Я думаю, вы не можете просто игнорировать часовой пояс. Вы должны использовать какой-то общий часовой пояс как для вашего сервера, так и для интерфейсного приложения, UTC или что-то в этом роде. Тогда проверьте документы здесь: date-fns.org/v2.16.1/docs/Time-Zones .

2. это имеет смысл. как именно я буду форматировать в часовой пояс UTC

Ответ №1:

Попробуйте что-то вроде этого:

 import {format} from "date-fns";
import {utcToZonedTime} from "date-fns-tz";

function getDateFormat(serverMillisTimestamp) {
  const utcTime = utcToZonedTime(serverMillisTimestamp, "UTC");
  return {
    year: format(utcTime, "yyyy").toString(),
    monthOfYear: format(utcTime, "MMMM").toString().toLowerCase(),
    isoWeekOfYear: format(utcTime, "II").toString(),
    dayOfMonth: format(utcTime, "dd").toString(),
    isoDayOfWeek: format(utcTime, "iiii").toString().toLowerCase(),
  };
}

const date = new Date();
console.log(getDateFormat(date.getTime()));