现在我正在尝试将以人类可读格式编写的日期解析为 SharePoint 列表将接受的 DateTime 字符串。为此,我确定我需要一个格式类似于 ISO 的字符串,如下所示:2007-08-20T00:00:00Z
。似乎 SharePoint 只接受 UTC 中不包含毫秒的 DateTimes(无论出于何种原因,SharePoint 都会出错并且在包含毫秒时不会接受 DateTime),因此我需要先将本地时间转换为 UTC 时间将其转换为 ISO 字符串。
这是下面代码使用的过程。
- 首先,我使用 DateJS 将我的人类日期解析为 JavaScript 日期。 (工作正常,但显然 DateJS 已被放弃,所以也许我 应该将其更改为使用 MomentJS。)
- 接下来我尝试创建一个新的 UTC 时刻。 (这条线非常非常错误,让我崩溃了 程序。)
- 然后我让 SPServices 将其转换为 ISO。 SPServices 删除 DateTime 的毫秒数,以便 SharePoint 接受它。 (作品 很好)。
我确信必须有一种更优雅/更有效的方法来实现这一点,而不是将 3 个不同的库拼接在一起。我只是不确定它是什么。
var jScriptStartDate = Date.parse("6/29/2014 8:30am"); //JS Date
var jScriptStartDateUTC = moment(jScriptStartDate).utc(); //local date to UTC.
var startDate = $().SPServices.SPConvertDateToISO({ //Sharepoint ISO 8601 format
dateToConvert: jScriptStartDateUTC,
dateOffset: "" //Sharepoint dates only accept UTC times, aka no dateOffset.
});
newItem.set_item('EventDate', startDate); //EventDate is internal for StartTime
最佳答案
你可以只使用 moment.js,这都在 the documentation 中.
moment('6/29/2014 8:30am','M/D/YYYY h:mma').toISOString()
假设满足以下所有条件:
源值在用户的时区(即运行 JavaScript 代码的机器的时区)
输入将始终采用指定的格式
还值得一提的是,如果您在“am”之前放置一个空格,那么大多数现代浏览器都可以在没有任何库的情况下本地执行此操作:
new Date('6/29/2014 8:30 am').toISOString()
如果您采用这种方法,请意识到日期部分是根据用户区域设置排序的,可能是 m/d/y、d/m/y 或 y/m/d。
此外,您在标题中说“...没有毫秒”,但没有在您的问题中详细说明。我相当确定您可以毫无问题地通过毫秒。没有充分的理由特意删除它们。但如果你必须,那么 moment 就像这样:
moment('6/29/2014 8:30am','M/D/YYYY h:mma').utc().format('YYYY-MM-DD[T]HH:mm:ss[Z]')
关于datetime - 将 JavaScript DateTime 转换为没有毫秒的 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24168072/