【问题标题】:Convert JavaScript DateTime to UTC with no milliseconds无需毫秒即可将 JavaScript DateTime 转换为 UTC
【发布时间】:2014-06-11 16:33:05
【问题描述】:

现在我正在尝试将以人类可读格式写入的日期解析为 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

【问题讨论】:

    标签: datetime momentjs datejs sharepoint-online spservices


    【解决方案1】:

    你可以只使用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]')
    

    【讨论】:

    • 我必须同意,似乎没有充分的理由删除毫秒,但出于某种奇怪的原因,SharePoint 不会接受任何未删除毫秒的 DateTime,即格式为YYYY-MM-DDThh:mm:ssZ。另外,很好的答案。我最终找到了一个仅使用 DateJS 的解决方案(但无法发布它,因为对于低代表用户回答您自己的问题有 8 小时的时间限制),所以我明天将发布给那些有兴趣走那条路。
    • 如果你使用它,请注意外壳。 hh 是 12 小时制,HH 是 24 小时制。就个人而言,我推荐使用 DateJS 的时刻,但如果您必须使用 DateJS,请考虑积极维护的 fork。 See here for details.
    • 会的,我目前的实现是使用新的 DateJS 分支。当我读到它有许多永远无法解决的错误时,我废弃了旧的。另外,感谢有关正确书写时间的提示。太糟糕了,我无法编辑 cmets 并修复我写的内容......
    • 没问题。很高兴为您提供帮助!
    • 2.13.0之后,可以简单调用:moment('6/29/2014 8:30am','M/D/YYYY h:mma').utc().format() ;这将返回一个 YYYY-MM-DDTHH:mm:ssZ 字符串
    【解决方案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 的处理程序下方。

    【讨论】:

    • 很高兴您喜欢我的 DateJS 更新版本! :) 这不是一个坏主意(看起来您只是复制和修改了 toISOString 方法),但在您的情况下,它会很简单:var startDate = Date.parse(yourStringDate).toString("yyyy-MM-ddTHH:mm:ss"); 将其从 3 行变为 2 :) 两者都可以!跨度>
    • 是的,我只是复制了 toISOString 方法,并进行了一次更改。代码可读性很强(每一行的作用真的很明显),这很好,而且很容易做到。看起来你的那个解决方案也很好,但是字符串格式不需要像yyyy-MM-ddTHH:mm:ssZ因为UTC ISO日期以“Z”结尾吗?
    • 正确!我的错字是真的。 .format 也会为您提供其他选项 - 因此您也可以使用非 UTC(本地)时区获得非 UTC。
    • 如果您想转换为 UTC 进行存储,然后再转换回本地时间供用户查看,这听起来会很方便。如果我以后要写这样的系统,我会记住的。
    猜你喜欢
    • 2012-09-13
    • 2019-12-05
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多