NetSuite用户事件服务端脚本:从日期时间字符串初始化DateTime对象
解决ISO 8601日期字符串转SuiteScript DateTime/JavaScript Date对象问题
1. JavaScript 原生方案
你的日期字符串是标准的ISO 8601 UTC格式,直接用new Date()就能正确解析,可能之前你误解了本地时区的显示差异:
const dateStr = "2022-10-27T01:35:48.354z"; const jsDate = new Date(dateStr); // 验证:输出的ISO字符串应该和原字符串一致(忽略大小写的z) console.log(jsDate.toISOString()); // 输出 "2022-10-27T01:35:48.354Z"
注意:new Date()会将UTC时间转换为当前运行环境的本地时区显示,但内部存储的时间戳是和原UTC时间完全一致的。
2. SuiteScript 2.x 方案
如果需要转换为SuiteScript的DateTime对象,有两种可靠方式:
方式一:从JS Date转换
先通过原生JS解析出Date对象,再转成SuiteScript DateTime:
import { DateTime } from 'N/record'; const dateStr = "2022-10-27T01:35:48.354z"; const jsDate = new Date(dateStr); const ssDateTime = DateTime.fromDate({ date: jsDate });
方式二:用format.parse(需指定UTC时区)
之前可能没指定时区导致解析错误,必须明确设置timezone为UTC:
import format from 'N/format'; import { DateTime } from 'N/record'; const dateStr = "2022-10-27T01:35:48.354z"; const ssDateTime = format.parse({ value: dateStr, type: format.Type.DATETIME, timezone: format.Timezone.UTC // 关键:原字符串是UTC时间,必须对应时区 });
3. Moment.js 方案
用moment.utc()解析UTC格式字符串,避免本地时区干扰:
const dateStr = "2022-10-27T01:35:48.354z"; const momentDate = moment.utc(dateStr); // 转JS Date const jsDate = momentDate.toDate(); // 转SuiteScript DateTime const ssDateTime = DateTime.fromDate({ date: jsDate });
常见问题排查
- 如果用
format.parse时时间偏差,大概率是没指定UTC时区,SuiteScript默认会用当前脚本的时区解析,导致UTC时间被转换为本地时区。 - 原生JS的
new Date显示的本地时间是正常的,要验证时间正确性,用toISOString()输出UTC格式字符串对比原输入即可。
内容的提问来源于stack exchange,提问作者Phanikumar Jatavallabhula
相关产品推荐
相关产品推荐

