我的配置是里斯本时区。当我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方法或使用可能的时刻来获取该格式?
无论什么时区或时刻,我只是模拟那是给定日期的午夜。
答案 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";
答案 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;
答案 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"