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



我的配置是里斯本时区。当我做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.000Z

2017-04-28T00:00:00+01:00

我想将此值作为一个静止方法的参数传递给它作为DateTime类型自动解析的参数,但是如果我从MONS.JS格式传递输出,则将其解析为2017-04-27 23:00:00.00

如果我使用new Date()或使用new Date('2017-04-27')(日期部分(创建新日期,我只想获得如下的ISO格式,没有时区域:

2017-04-28T00:00:00.000Z

是否有JavaScript方法,例如ToisoString((或使用时刻来获取该格式?

无论一天中的时区域或时刻,我都只是为了模拟那是给定日期的午夜。

非常不清楚你'什么重新问。如果您希望与小时的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:00:00 Z(即,应根据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());

您可以通过简单地使用moment.format()制定所需的所有内容,然后简单地将额外的Z附加到字符串中。您必须执行此操作,因为Z内的Z保留用于输出。

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

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

old_date = fri = fri jan 08 2021 16:01:01:30 GMT 0900

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

new_date =" 2021-01-08&quot

您可以尝试一下,对我有用!您将拥有 ISO格式没有时区效果

星期五1月1日2021 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);

您不需要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()
    }
  }
}

还有另一种棘手的方法可以从此答案中使用它。以瑞典日期格式,您可以轻松地将日期转换为ISO格式,如下:

new Intl.DateTimeFormat('sv-SE').format(new Date());//'2022-07-08'

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

moment().toISOString(keepOffset);

我编写了一个简单的功能,该功能扩展了矩js对象:

moment.fn.toISOStringWithoutTimezone = function () {
  return this.format("YYYY-MM-DD[T]HH:mm:ss");
};

可以像

一样使用它
moment().toISOStringWithoutTimezone();

我的问题:我需要一直将日期和时间发送到服务器API中。为了解决此问题,我可以简单地使用new Date((。toisoString((,但是我的客户端应用程序可以在不同的时区域下运行,因此会始终存在时区差异。

解决方案:要解决此问题,我转介上面给出的解决方案,即手动创建ISO格式字符串,无论给定的时区域均不含时区。

function getISOString(date)
{
let d = new Date(date),
month = '' + (d.getMonth() + 1),
day = '' + d.getDate(),
year = ''+ d.getFullYear(),
hours = ''+d.getHours(),
minutes = ''+d.getMinutes(),
seconds = ''+d.getSeconds();
month = month.length < 2? '0' + month : month;
day   = day.length < 2? '0' + day : day;
hours = hours.length < 2?'0'+hours:hours;
minutes = minutes.length< 2? '0'+minutes:minutes;
seconds = seconds.length< 2? '0'+seconds:seconds;
return ( [year, month, day].join('-')+'T'+[hours,minutes,seconds].join(':')+'.000');
}
console.log(getISOString(new Date()));

我想您希望在ISO 8601中获得当前日期将其传递给您的API?也许在此处提到的本机JavaScript使用片刻。

如您的示例:

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>

从我的理解中,您想要在日期开始等法

(即(时区应为00: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()));

这将在时区开始返回当前日期。UTC时间(00:00:00(您可以使用:

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

这是您的两个解决方案....

最初,我写了一小部分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;
}

新日期('2019-04-27'(。toisostring((;

您也可以使用dayjs:https://day.js.org/

日期格式不是主要问题。
整个问题基于一个相对错误的前提。

首先,有必要意识到可能是日期的。

第一个替代方法是:&quot我什么时候在手表上看到
那就是"相对日期"因为我在欧洲看到11:00的不同时间有人在我们看到11:00

第二个替代方案是:"指向特定的时刻"
可以命名为"绝对日期"。对于这种观点,最重要的是Unix时间戳。时间戳记在全世界都同步滴答滴答,尽管不同的人在手表上看到不同的时间。

因此, 2017-04-28T00:10:55.964Z等于时间戳 1493338255 (btw Z in Date String中的含义:这是GMT的时间(。同一时间戳具有2017-04-28T01:10:55.964+01:002017-04-28T09:10:55.964+09:002017-04-27T16:10:55.964-08:00

这意味着: isodateString我在手表上看到什么时候,距离格林威治有多远

和现在实现。
说您需要什么真的很重要。

让我们进行一组小时的活动。

现在我们来自我们的家伙来问:&quot'昨天发生了什么?回应应有什么?

再次有2种可能性:

  1. 他的日子2017-04-28T00:00:00-08:00 ... 2017-04-28T23:59:59-08:00
    这意味着2017-04-28T08:00:00Z .. 2017-04-29T07:59:59Z,这是正确的,因为这是我们人们的实际日期

  2. 日历日2017-04-28
    期间发生了什么您可以想要一些全球统计数据,这是需要在我们和日本上看到相同的东西。
    解决方案真的很简单 - 只需从问题中删除时移-08:00
    moment('2017-04-28').format(YYYY-MM-DDTHH:mm:ss)应该做这样的事情:
    2017-04-28T00:00:00 ... 2017-04-28T23:59:59

请小心,这不是IsodateTime ,您必须在API上处理它!

moment('2017-04-28').utcOffset(0, true).toISOString()

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

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"

最新更新