javascript 从openweather API将本地时间转换为长格式

uemypmqf  于 2023-03-28  发布在  Java
关注(0)|答案(2)|浏览(80)

我从开放天气API获取数据

dt:1679888142
timezone:7200

我试图通过在JavaScript中应用Date对象,然后应用toUTCString()来获取本地时间,从而将UNIX时间更改为本地时间。
目标是将获得的本地时间'Mon, 27 Mar 2023 05:35:42 GMT'更改为长格式的时间,例如'Monday, March 27 at 4:35 AM'。当我应用以下代码时,它没有格式化,还添加了我的时区差异。
这是下面的代码

let epochtime = weatherData.dt;
  let timezone = weatherData.timezone;
  const rfc2822Date = new Date((epochtime + timezone) * 1000).toUTCString();

  const options = {
    weekday: "long",
    month: "long",
    day: "numeric",
    hour: "numeric",
    minute: "numeric",
    hour12: true
  };
const longFormatDateTime =  rfc2822Date.toLocaleString("en-us",options);

我试图再次将日期传递到日期对象,这将导致GMT+时区和格式。格式似乎工作,但本地时间是错误的

kmpatx3s

kmpatx3s1#

因为我们在这里处理的是一个固定的偏移量,所以在创建Date对象时,我们可以简单地将UTC偏移量(以秒为单位)添加到epoch时间。但是,我们需要在格式化时指定'UTC'时区,以避免在客户端的时区中进行格式化。

function formatUnixTime(epochTime, utcOffsetSeconds, options = {}) {
  const date = new Date((epochTime + utcOffsetSeconds) * 1000);
  return date.toLocaleTimeString([], { timeZone: 'UTC', ...options });
}

function getLongFormatUnixTime(epochTime, utcOffsetSeconds) {
  const options = { weekday: 'long', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true };
  return formatUnixTime(epochTime, utcOffsetSeconds, options);
}

const weatherData = { 
  dt: 1679888142,
  timezone: 7200
}
 
const epochTime = weatherData.dt;
const utcOffset = weatherData.timezone;
 
console.log('Unix time:     ', epochTime);
console.log('UTC Offset (s):', utcOffset);
console.log('Time (UTC):    ', getLongFormatUnixTime(epochTime, 0));
console.log('Time (in zone):', getLongFormatUnixTime(epochTime, utcOffset));
zbq4xfa0

zbq4xfa02#

您需要直接在日期对象上调用toLocaleString,而不是rfc2822字符串。

let epochtime = weatherData.dt;
  let timezone = weatherData.timezone;
  const UNIXDate = new Date((epochtime + timezone) * 1000);

  const options = {
    weekday: "long",
    month: "long",
    day: "numeric",
    hour: "numeric",
    minute: "numeric",
    hour12: true
  };

const longFormatDateTime =  UNIXDate.toLocaleString("en-us",options);

希望这个有用。

相关问题