将时间转换为另一个时区 JS

Converting time to another timezone JS

我正在获取 data.value 格式的时间:hh:mm a - 例如 12:30 am.

我也知道:

  1. 用户的本地时区 (userTimeZone)
  2. 场地的时区(venueTimeZone)

我需要将用户 (data.value) 选择的时间转换为 venueTimeZone 中的正确日期。例如,如果用户在 Americas/New York 并且他们在 2022 年 5 月 20 日选择了 1:30PM,并且场地在 Americas/Los Angeles - 我有兴趣获得的值是 20/05/2022 10:30AM.

这是我的尝试,但是时区本身没有改变 - 我认为这是因为当我用 moment 创建 userDateTime 时,我没有指定时间偏移量,但我我不确定如何在考虑 DST 的同时从 userTimeZone 获取偏移量。

            const userTimeZone = _.get(
                Intl.DateTimeFormat().resolvedOptions(),
                ['timeZone']
            );

            const venueDateStr = new Date().toLocaleString('en-US', {
                timeZone: venueTimeZone,
            });

            const Date = new Date(restaurantDateStr);
            const venueYear = venueDate.getFullYear();
            const venueMonth = `0${venueDate.getMonth() + 1}`.slice(-2);
            const venueDateOfMonth = `0${venueDate.getDate()}`.slice(-2);

            const userDateTime = createDateAsUTC(
                moment(
                    `${venueDateOfMonth}/${venueMonth}/${venueYear} ${data.value}`,
                    'DD/MM/YYYY hh:mm a'
                ).toDate()
            ).toLocaleString('en-US', { timeZone: venueTimeZone });

编辑 - 我没有城市偏移量,我有时区名称,因此我不能使用任何依赖于城市偏移量的建议答案。

考虑使用 Luxon - the successor to Moment. (See Moment's project status。)

// Parse your input string using the user's local time zone
// (this assumes the current local date)
const local = luxon.DateTime.fromFormat('1:30 pm', 'h:mm a');

// Convert to the desired time zone
const converted = local.setZone('America/Los_Angeles');

// Format the output as desired
const formatted = converted.toFormat('dd/MM/yyyy h:mm a').toLowerCase();

console.log(formatted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/2.4.0/luxon.min.js"></script>

您也可以在没有库的情况下执行此操作,但是您可能会发现并非所有浏览器都会解析输入字符串,并且您的输出格式也取决于浏览器。

// Get the current local date as a string
const date = new Date().toLocaleDateString();

// Parse the date and time in the local time zone
// Warning: This is non-standard and may fail in some environments
const dt = new Date(date + ' 1:30 pm');

// Format the output, converting to the desired time zone
const result = dt.toLocaleString(undefined, { timeZone: 'America/Los_Angeles' });

console.log(result);

当然,有手动方法来解析和格式化日期(使用正则表达式等),但我会把它留给你或其他人来完成。