我的配置是里斯本时区。当我做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:00
,2017-04-28T09:10:55.964+09:00
,2017-04-27T16:10:55.964-08:00
等
这意味着: isodateString我在手表上看到什么时候,距离格林威治有多远
和现在实现。
说您需要什么真的很重要。
让我们进行一组小时的活动。
现在我们来自我们的家伙来问:&quot'昨天发生了什么?回应应有什么?
再次有2种可能性:
-
他的日子
2017-04-28T00:00:00-08:00 ... 2017-04-28T23:59:59-08:00
这意味着2017-04-28T08:00:00Z .. 2017-04-29T07:59:59Z
,这是正确的,因为这是我们人们的实际日期 -
日历日
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"