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

时间:2017-04-28 00:31:54

标签: javascript rest date datetime momentjs

我的配置是里斯本时区。当我new Date()时,我的当前日期/时间为Fri Apr 28 2017 01:10:55 GMT+0100 (GMT Daylight Time)

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

2017-04-28T00:10:55.964Z

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

2017-04-27T23:45:05.654Z

我尝试了moment.js(这是新手),我做了类似的事情

document.write(moment('2017-04-28').format())

但我得到的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

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

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

11 个答案:

答案 0 :(得分:7)

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



var d = new Date();
d.setUTCHours(0,0,0,0);
console.log(d.toISOString());




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

此外,

new Date('2017-04-27').toISOString();

应该返回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());




但是,由于内置的​​ 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());




答案 1 :(得分:4)

您可以通过使用moment.format()简单地格式化您需要的所有内容,然后将额外的Z附加到字符串来实现此目的。你必须在Z内保留输出的时间。

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

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

答案 2 :(得分:3)

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

const new_date = old_date.toISOString().substring(0, 10);

new_date = "2021-01-08"

答案 3 :(得分:0)

我想您希望将ISO 8601中的当前日期传递给您的API? 对于提到here的原生JavaScript,使用moment.js包装器可能有帮助吗?

如你的例子所示:

document.write(moment('01/12/2016', 'DD/MM/YYYY', true).toISOString());

段:



$(function(){
  var displaysTime = $('#divTime');
  displaysTime.text(moment.utc('27/04/2017', 'DD/MM/YYYY', true).toISOString());
});

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>

<div id="divTime">
</div>
&#13;
&#13;
&#13;

答案 4 :(得分:0)

您不需要moment.js库,只需解析和连接日期组件即可。例如

type Components = {
  day: number,
  month: number,
  year: number
}

export default class DateFormatter {
  // 2018-11-11T00:00:00
  static ISOStringWithoutTimeZone = (date: Date): string => {
    const components = DateFormatter.format(DateFormatter.components(date))
    return `${components.year}-${components.month}-${components.day}T00:00:00`
  }

  static format = (components: Components) => {
    return {
      day: `${components.day}`.padStart(2, '0'),
      month: `${components.month}`.padStart(2, '0'),
      year: components.year
    }
  }

  static components = (date: Date): Components => {
    return {
      day: date.getDate(),
      month: date.getMonth() + 1,
      year: date.getFullYear()
    }
  }
}

答案 5 :(得分:0)

您可以使用https://momentjs.com/docs/#/displaying/as-iso-string /

R = /(?<=\()(?!\d) *|(?=\((?!\d)) *|(?<!\d)(?=\)) *|(?<=\)) *|(?<![*=+\/-]) +| +(?=\()/

答案 6 :(得分:0)

您可以尝试使用此简单的javascript

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID_concept", Int64.Type}, {"ID_country", Int64.Type}, {"7", type number}, {"8", type number}, {"9", type number}, {"10", type number}, {"11", type number}, {"12", type number}, {"13", type number}, {"14", type number}}),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"ID_concept", "ID_country"}, "Attribute", "Value"),
    #"Renamed Columns" = Table.RenameColumns(#"Unpivoted Other Columns",{{"Attribute", "ID_Period"}}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Renamed Columns",{{"ID_Period", Int64.Type}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type1",{{"ID_Period", Order.Ascending}, {"ID_country", Order.Ascending}})
in
    #"Sorted Rows"

答案 7 :(得分:0)

根据我的理解,您希望日期的ISOString不受时间限制

(即,无论您选择什么日期,时区都应为“ T00:00:00.000Z”。

我认为不使用任何插件就不会有直接功能。

因此,我创建了一个功能来满足您的需求,如果这正是您想要的

function mimicISOString(date) {
    let d = new Date(date),
        month = '' + (d.getMonth() + 1),
        day = '' + d.getDate(),
        year = d.getFullYear();

    if (month.length < 2) 
        month = '0' + month;
    if (day.length < 2) 
        day = '0' + day;

    return [year, month, day].join('-') +'T00:00:00.000Z';
}

console.log(mimicISOString(new Date()));

这将返回时区开始的当前日期。如果这是您要查找的

答案 8 :(得分:0)

如果您希望日期采用UTC时间(00:00:00),则可以使用:

moment.utc('2017-04-28').toISOString() // 2017-04-28T00:00:00.000Z

答案 9 :(得分:0)

这是为您提供的两种解决方案。...

最初,我写了一小段JavaScript(好吧,好吧, Typescript ),它使用Date值并将其转换为ISO日期字符串,如下所示:

createDateString(dateStr) {     
  //  Take a Date value, and turn it into a "2005-05-26T11:37:42" string
  var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds
  var currentDate = new Date(dateStr);
  var withTimezone = new Date(currentDate.getTime() - tzoffset);
  var localISOTime = withTimezone.toISOString().slice(0, 19).replace('Z', '');
  return localISOTime;
}

这很好用...直到将它部署到服务器上。然后,我注意到时区错了。

我的解决方案(不求助于第三方产品)是这样重写:

padZero(numericValue) {
  if (numericValue < 10)
      return '0' + numericValue.toString();;
     
  return numericValue.toString();;
}
createDateString(date) {     
  //  Take a Date value, and turn it into a "2005-05-26T11:37:42" string
  var dateStr = date.getFullYear() + '-' + 
        this.padZero(date.getMonth()+1) + '-' +
        this.padZero(date.getDate()) + 'T' +
        this.padZero(date.getHours()) + ':' + 
        this.padZero(date.getMinutes()) + ':' + 
        this.padZero(date.getSeconds());

  return dateStr;
}

答案 10 :(得分:-1)

我相信你说你想在里斯本获得当前日期:

moment().tz("Europe/Lisbon").format('YYYY-MM-DD')

您可以看到这种方式符合您的预期:

moment('2017-04-28T00:00:00+01:00').tz("Europe/Lisbon").format('YYYY-MM-DD') //"2017-04-28"