2

现在,我正在尝试将以人类可读格式写入的日期解析为 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 接受它。(工作正常)。

我确信必须有一种更优雅/更有效的方式来实现这一点,而不是将 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
4

2 回答 2

6

您可以只使用 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]')
于 2014-06-11T23:38:52.667 回答
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并将代码放在toISOString.

于 2014-06-12T12:42:09.377 回答