Get ISO string from a date without time zone

2020-06-08 00:42发布

问题:

My configuration is Lisbon time zone. When I do new Date() I get my current local date/time which is Fri Apr 28 2017 01:10:55 GMT+0100 (GMT Daylight Time)

When I get the ISO string with toISOString() it will apply the time zone and I will get:

2017-04-28T00:10:55.964Z

The problem is that some minutes ago the date time was like this (yesterday):

2017-04-27T23:45:05.654Z

I tried moment.js (new to this) and I did something like this

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

But I get this 2017-04-28T00:00:00+01:00 which is not 2017-04-28T00:00:00.000Z

I want to pass this value as a parameter of a restful method to parse it automatically as a DateTime type, but if I pass the output from moment.js format then it will get parsed as 2017-04-27 23:00:00.00

If I create a new date with new Date() or with new Date('2017-04-27') (date portion), I just want to get the ISO format like as follows with no time with no time zone

2017-04-28T00:00:00.000Z

Is there a javascript method like toISOString() or using maybe moment to get that format?

No matter what time zone or moment of day, I just to simulate that is midnight of the date given.

回答1:

It's very unclear what you're asking. If you want the UTC date with the hours always 0, then set the UTC hours to 0 and use toISOString, e.g.

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

Of course this is going to show the UTC date, which may be different to the date on the system that generated the Date.

Also,

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

should return 2017-04-27T00:00:00Z (i.e. it should be parsed as UTC according to ECMA-262, which is contrary to ISO 8601 which would treat it as local), however that is not reliable in all implementations in use.

If you just want to get the current date in ISO 8601 format, you can do:

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());

However, since the built-in toISOString uses UTC this might be confusing. If the UTC date is required, then:

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());



回答2:

You can achieve this by simply formating everything that you need in place using moment.format() and then simply append the extra Z to the string. You have to do this as Z within moment JS is reserved for outputting.

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

Fiddle example https://jsfiddle.net/2avxxz6q/



回答3:

You don't need moment.js library, you can just parse and connect date components. For example

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()
    }
  }
}


回答4:

I suppose you wish to get the current date in ISO 8601 to pass it to your API? Maybe using a moment.js wrapper for native JavaScript mentioned here might help?

As in your example:

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

Snippet:

$(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>



回答5:

You can use https://momentjs.com/docs/#/displaying/as-iso-string/

moment().toISOString(keepOffset);


回答6:

You can try this simple javascript

(new Date()).toJSON().replace(/\..*$/g,'')


回答7:

From my understanding you want ISOString of start of the date irrespective of time

(ie) Time zone should be'T00:00:00.000Z' more matter what date you choose.

I dont think there is a straight function without using any plugin.

So i created a function to fullfill your need,If this is what you are looking for

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()));

This will return current date with start of the time zone.If this is what you are looking for



回答8:

I believe you are saying you'd like to get the current date in Lisbon:

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

You can see that this works the way you think it should:

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