从没有时区的日期获取ISO字符串

Max*_*mus 15 javascript rest datetime date momentjs

我的配置是里斯本时区.当我这样做时,new Date()我得到当前的当地日期/时间Fri Apr 28 2017 01:10:55 GMT+0100 (GMT Daylight Time)

当我获得ISO字符串时toISOString(),它将应用时区,我会得到:

2017-04-28T00:10:55.964Z
Run Code Online (Sandbox Code Playgroud)

问题是几分钟前的日期时间是这样的(昨天):

2017-04-27T23:45:05.654Z
Run Code Online (Sandbox Code Playgroud)

我尝试了moment.js(对此我不熟悉),我做了类似的事情

document.write(moment('2017-04-28').format())
Run Code Online (Sandbox Code Playgroud)

但我得到的2017-04-28T00:00:00+01:00不是这个2017-04-28T00:00:00.000Z

我想将此值作为restful方法的参数传递,以自动将其解析为DateTime类型,但如果我从moment.js格式传递输出,那么它将被解析为 2017-04-27 23:00:00.00

如果我new Date()new Date('2017-04-27')(或日期部分)创建一个新的日期,我只想得到如下的ISO格式,没有时间没有时区

2017-04-28T00:00:00.000Z
Run Code Online (Sandbox Code Playgroud)

是否有类似toISOString()的javascript方法或使用可能的时刻来获取该格式?

无论什么时区或时刻,我只是模拟那是给定日期的午夜.

yns*_*ter 10

你可以试试这个,它对我有用!您将拥有 没有时区影响的ISO 格式

2021 年 1 月 1 日星期五23:10:00 GMT+0100 => 2021-01-01T 23:10:00.000Z

function isoDateWithoutTimeZone(date) {
  if (date == null) return date;
  var timestamp = date.getTime() - date.getTimezoneOffset() * 60000;
  var correctDate = new Date(timestamp);
  // correctDate.setUTCHours(0, 0, 0, 0); // uncomment this if you want to remove the time
  return correctDate.toISOString();
}


        var now= new Date("01-01-2021 23:10:00");
        console.log(now.toString());
        var returnedDate = isoDateWithoutTimeZone(now);
        console.log(returnedDate);
Run Code Online (Sandbox Code Playgroud)


Rob*_*obG 9

目前还不清楚你在问什么.如果您希望UTC日期的小时数始终为0,则将UTC小时数设置为0并使用toISOString,例如

var d = new Date();
d.setUTCHours(0,0,0,0);
console.log(d.toISOString());
Run Code Online (Sandbox Code Playgroud)

当然,这将显示UTC日期,该日期可能与生成日期的系统上的日期不同.

也,

new Date('2017-04-27').toISOString();
Run Code Online (Sandbox Code Playgroud)

返回2017-04-27T00:00:00Z(即它应根据ECMA-262解析为UTC,这与ISO 8601相反,后者将其视为本地),但这在所有使用的实现中都不可靠.

如果您只想获得ISO 8601格式的当前日期,您可以:

if (!Date.prototype.toISODate) {
  Date.prototype.toISODate = function() {
    return this.getFullYear() + '-' +
           ('0'+ (this.getMonth()+1)).slice(-2) + '-' +
           ('0'+ this.getDate()).slice(-2);
  }
}

console.log(new Date().toISODate());
Run Code Online (Sandbox Code Playgroud)

但是,由于内置的toISOString使用UTC,因此可能会造成混淆.如果需要UTC日期,则:

if (!Date.prototype.toUTCDate) {
  Date.prototype.toUTCDate = function() {
    return this.getUTCFullYear() + '-' +
           ('0'+ (this.getUTCMonth()+1)).slice(-2) + '-' +
           ('0'+ this.getUTCDate()).slice(-2);
  }
}

console.log(new Date().toUTCDate());
Run Code Online (Sandbox Code Playgroud)

  • 对于 GetISODate,为什么不使用更简单一点的方法: `if (!Date.prototype.toISODate) { Date.prototype.toISODate = function() { return this.toISOString().substring(0,10); } } }` (2认同)

小智 6

old_date = 2021 年 1 月 8 日星期五 16:01:30 GMT+0900

const new_date = old_date.toISOString().substring(0, 10);
Run Code Online (Sandbox Code Playgroud)

new_date = "2021-01-08"

  • 这一行代码足够清晰,任何 JavaScript 开发人员都知道发生了什么。简单而有效,它只是删除日期字符串中不需要的时间字符。我想知道为什么之前没有人提出这个解决方案。我看不到据报道该解决方案已经得到解答的旧答案。 (2认同)

li *_*i x 5

您可以通过使用格式化所需的所有内容,moment.format()然后将多余的Z附加到字符串中来实现此目的。您必须这样做,因为在JS保留用于输出的瞬间之内为Z。

var date = moment('2014-08-28').format("YYYY-MM-DDT00:00:00.000") + "Z";
Run Code Online (Sandbox Code Playgroud)

小提琴示例https://jsfiddle.net/2avxxz6q/