将JavaScript DateTime转换为UTC,没有毫秒

Ect*_*opy 2 datetime datejs momentjs spservices sharepoint-online

现在,我正在尝试将以人类可读格式编写的日期解析为SharePoint列表将接受的DateTime字符串.为了做到这一点,我已经确定我需要一个类似于ISO的格式的String,如下所示:2007-08-20T00:00:00Z.似乎SharePoint只接受UTC中没有包含毫秒的DateTimes(无论出于何种原因,SharePoint会出现错误,并且当您包含毫秒时不会接受DateTime),所以我需要将本地时间转换为UTC时间之前将其转换为ISO字符串.

这是以下代码使用的过程.

  1. 首先,我使用DateJS将我的人类日期解析为JavaScript日期.(工作正常,但显然DateJS已被放弃,所以也许我应该改变它以使用MomentJS.)
  2. 接下来,我尝试在UTC中创建一个新时刻.(这条线非常非常错误,并使我的程序崩溃.)
  3. 然后我让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
Run Code Online (Sandbox Code Playgroud)

Mat*_*int 6

你可以使用moment.js,这就是文档中的全部内容.

moment('6/29/2014 8:30am','M/D/YYYY h:mma').toISOString()
Run Code Online (Sandbox Code Playgroud)

这假设了以下所有内容:

  • 源值位于用户的时区(即运行JavaScript代码的计算机的时区)

  • 输入将始终采用指定的格式

还值得一提的是,如果你在"am"之前放置一个空格,那么大多数现代浏览器都可以在没有任何库的情况下本地执行此操作:

new Date('6/29/2014 8:30 am').toISOString()
Run Code Online (Sandbox Code Playgroud)

如果采用这种方法,请认识到日期部分是根据用户区域设置排序的,可能是m/d/y,或者是d/m/y或y/m/d.

另外,你在标题中说"......没有毫秒",但在你的问题中没有详细说明.我相当肯定你可以毫无问题地通过毫秒.你没有充分的理由去除它们.但是,如果你必须,那么就像这样:

moment('6/29/2014 8:30am','M/D/YYYY h:mma').utc().format('YYYY-MM-DD[T]HH:mm:ss[Z]')
Run Code Online (Sandbox Code Playgroud)