【问题标题】:Is there any way to produce this string date representation (with time-zone) without using javascript substring functions or regex?有没有办法在不使用 javascript 子字符串函数或正则表达式的情况下生成这个字符串日期表示(带时区)?
【发布时间】:2013-02-20 23:42:35
【问题描述】:

从一个新的 Date 对象开始,有没有办法只使用 Date 对象的内置方法来生成以下字符串表示形式——即不允许使用正则表达式和/或子字符串操作? "2013-02-01T00:00:00-05:00"

【问题讨论】:

  • 如果字符串连接没问题(并且没有充分的理由不这样做),那么“是”,尽管时区推断可能很棘手。
  • JS中没有“子串操作”,所有的字符串值都是不可变的。

标签: javascript date


【解决方案1】:

仅使用 Date 对象的内置方法

没有。 JavaScript 不允许您输出带有自定义时区值的 ISO 8601 字符串,.toISOSTring 始终使用 Z (UTC)。

您将需要使用各种 getter 方法并自己构造字符串。以How do I output an ISO 8601 formatted string in JavaScript?How to convert ISOString to local ISOString in javascript? 为基础:

function customISOstring(date, offset) {
    var date = new Date(date), // copy instance
        h = Math.floor(Math.abs(offset)/60),
        m = Math.abs(offset) % 60;
    date.setMinutes(date.getMinutes() - offset); // apply custom timezone
    function pad(n) { return n < 10 ? '0' + n : n }
    return    date.getUTCFullYear() + '-' // return custom format
        + pad(date.getUTCMonth() + 1) + '-'
        + pad(date.getUTCDate()) + 'T'
        + pad(date.getUTCHours()) + ':'
        + pad(date.getUTCMinutes()) + ':'
        + pad(date.getUTCSeconds())
        + (offset==0 ? "Z" : (offset<0 ? "+" : "-") + pad(h) + ":" + pad(m));
}

【讨论】:

  • 被接受为最彻底的答案。感谢您和所有回复的人。
【解决方案2】:

这非常简单,尽管您需要一个辅助函数来避免重复:

var pad = function(n) {return n < 10 ? "0"+n : n;};
var output = date.getFullYear()+"-"+pad(date.getMonth()+1)+"-"+pad(date.getDate())
      +"T"+pad(date.getHours())+":"+pad(date.getMinutes())+":"+pad(date.getSeconds())
      +(date.getTimezoneOffset() > 0 ? "-" : "+")
          +pad(Math.floor(date.getTimezoneOffset()/60))
          +":"+pad(date.getTimezoneOffset()%60);

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 2011-04-19
    • 2018-05-04
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多