如何避免Luxon在创建DateTime对象时添加时区偏移
解决方案
你需要直接将输入字符串中的日期时间字面量(年、月、日、时、分)作为目标时区的本地时间来创建Luxon DateTime对象,而不是先解析为UTC再转换时区。以下是修正后的代码:
const addTimezoneToDateTimeValue = ({ timezone, dateTimeString, }: FunctionArgs) => { // 将输入的ISO字符串解析为UTC时间,仅用于提取字面量日期时间字段 const dateParts = DateTime.fromISO(dateTimeString, { zone: 'utc' }); // 在目标时区下,使用提取到的字段创建DateTime对象 const finalDateTime = DateTime.fromObject({ year: dateParts.year, month: dateParts.month, day: dateParts.day, hour: dateParts.hour, minute: dateParts.minute, second: 0 }, { zone: timezone }); // 返回对应的Date对象 return new Date(finalDateTime.toISO()); };
问题原因分析
你原来的代码逻辑存在两个关键问题:
- 先用
DateTime.fromISO(dateTimeString)将带Z的字符串解析为UTC时间,此时dateAndTimeHolder.hour是UTC时区的8:30。 - 接着通过
currentTimeInTimezone.set(...)将UTC的时分秒赋值给目标时区的DateTime对象,Luxon会将这些值视为目标时区的本地时间,但由于目标时区(Africa/Johannesburg)是UTC+2,最终生成的时间会对应UTC的6:30,而你需要的是目标时区本地时间的8:30。
修正后的逻辑直接在目标时区下构建DateTime对象,确保输入的时分秒被当作该时区的本地时间,同时自动应用正确的时区偏移量,最终得到你期望的2023-03-02T08:30:00.00+02:00。
内容的提问来源于stack exchange,提问作者Mata00616
相关产品推荐
相关产品推荐

