javascript 根据用户时区生成时间戳实现“用户友好个性化”

pb3s4cty  于 2023-03-16  发布在  Java
关注(0)|答案(1)|浏览(129)

我需要根据每个用户的时区获得月底的历元时间,以提供用户友好的体验。
例如,对于斯里兰卡的用户,现在可能是三月,而美国仍然是二月。我需要一种可靠的方法来计算时间戳,而不受服务器本地时间的干扰。这样,我就可以在世界任何地方托管它而不会遇到问题
应按如下方式计算,

  • 根据locale timezone取当前年月

我尝试使用Intl API,但无法确定

  • 则获取本月的最后一天或下月的第一天
new Date (locale_year,locale_month+1,0)
.valueOF()

尝试使用JS Intl API中的时区选项TimeZone

z2acfund

z2acfund1#

在试验了所有Date.prototypesIntl.DateTimeFormat
此函数帮助根据每个用户的时区进行逻辑,没有不可预见的服务器本地时间干扰
访问IANA time zone database以获取更多时区标识符,例如Asia/ShanghaiAsia/KolkataAmerica/New_York

function dateWithTZone (timezone,date){

    const options = {
      year: "numeric",
      month: "numeric",
      day: "numeric",
      hour: "numeric",
      minute: "numeric",
      second: "numeric",
      hour12: false,
      timeZone: timezone,
      timeZoneName: "longOffset",
    };
    const dateArray = new Intl.DateTimeFormat("en-US", options).formatToParts(date);
    const dateObj = dateArray.reduce((acc, cur) => ({...acc,[cur.type]: cur.value}),{});
    const {hourOffset,minuteOffset} = getOffset(dateObj.timeZoneName)
    return {...dateObj,hourOffset,minuteOffset}
}
function getOffset (timeZoneName){
    return {
      hourOffset: parseInt(
        timeZoneName.slice(3, 4) + timeZoneName.slice(4, 6)
      ),
      minuteOffset: parseInt(
        timeZoneName.slice(3, 4) + timeZoneName.slice(7, 9)
      ),
    };
}

dateWithTZone()返回的month具有值1-12。通常Javascript月份值来自0-11

// get the timezone from the user. here I use "Asia/Kolkata"
const {year,month,hourOffset,minuteOffset} = dateWithTZone("Asia/Kolkata",Date.now())
// I wanted to get user's current month end timestamp 
Date.UTC(year,month,1,-hourOffset,-minuteOffset)

相关问题