将时间转换为另一个时区 JS
Converting time to another timezone JS
我正在获取 data.value
格式的时间:hh:mm a
- 例如 12:30 am
.
我也知道:
- 用户的本地时区 (
userTimeZone
)
- 场地的时区(
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);
当然,有手动方法来解析和格式化日期(使用正则表达式等),但我会把它留给你或其他人来完成。
我正在获取 data.value
格式的时间:hh:mm a
- 例如 12:30 am
.
我也知道:
- 用户的本地时区 (
userTimeZone
) - 场地的时区(
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);
当然,有手动方法来解析和格式化日期(使用正则表达式等),但我会把它留给你或其他人来完成。