时区独立格式化 date-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 以便我可以从数据库查询记录时,存在不匹配,因为格式使用区域设置时区来获取这些值。

如何利用 date-fns 使格式化的值与时区无关?

解决方法

尝试这样的事情:

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()));