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

时间:2014-06-11 16:33:06

标签: datetime momentjs datejs sharepoint-online spservices

现在,我正在尝试将以人类可读格式编写的日期解析为SharePoint列表将接受的DateTime字符串。为了做到这一点,我确定我需要一个类似于ISO的格式的字符串,如下所示: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接受它。 (作品 细)。
  4. 我确信必须有一种更优雅/更有效的方法来实现这一目标,而不是将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
    

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

我最终调整此代码以使用更新的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并将代码放在处理程序正下方{ {1}}。