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



现在我正试图解析一个以人类可读格式写入SharePoint列表将接受的DateTime字符串的日期。为了做到这一点,我确定我需要一个类似ISO格式的字符串,看起来像:2007-08-20T00:00:00Z。似乎SharePoint只接受UTC的日期时间,不包括毫秒(无论出于什么原因,SharePoint给出错误,当你包括毫秒时,不会接受DateTime),所以我需要在将其转换为ISO字符串之前将我的本地时间转换为UTC时间。

下面的代码使用的是这个过程。

    首先,我使用DateJS将我的人类日期解析为JavaScript日期。(工作良好,但显然DateJS已被放弃,所以也许我应该将其更改为使用MomentJS。)
  1. 下一步我尝试创建一个新的在UTC的时刻。(这句话是非常非常错误的,并且破坏了我的计划。)
  2. 然后我有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,这些都在文档中。

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('6/29/2014 8:30am','M/D/YYYY h:mma').utc().format('YYYY-MM-DD[T]HH:mm:ss[Z]')

我最终调整了这段代码,以使用更新的DateJS (https://github.com/abritinthebay/datejs/)和我创建的一个名为.toShortISOString()的自定义函数。

这个过程只有3行:

var jScriptStartDate = Date.parse("6/28/2014 8:00am"); //convert to Javascript Date
var startDate = jScriptStartDate.toShortISOString(); //convert to Sharepoint ISO format (UTC with no milliseconds)
newItem.set_item('EventDate', startDate); //Strangely the internal name for Start Time is EventDate

.toShortISOString()的主要变化是删除毫秒,因为SharePoint不喜欢毫秒。它的代码在date.js文件中看起来像这样:

if ( !$P.toShortISOString ) {
        $P.toShortISOString = function() {
            return this.getUTCFullYear() +
            "-" + p(this.getUTCMonth() + 1) +
            "-" + p(this.getUTCDate()) +
            "T" + p(this.getUTCHours()) +
            ":" + p(this.getUTCMinutes()) +
            ":" + p(this.getUTCSeconds()) +
            //Remove the milliseconds.
            //"." + String( (this.getUTCMilliseconds()/1000).toFixed(3)).slice(2, 5) +
            "Z";
        };
    }

如果您试图将此添加到date.js,请确保从上面的链接中获得最新版本,然后在文件中搜索toISOString,并将代码放在toISOString处理程序的正下方。

最新更新