如何从非标准日期格式在Javascript中创建新日期()
我有一个这种格式的日期:dd.mm.yyyy 当我用它实例化JavaScript日期时,它会给我一个如何从非标准日期格式在Javascript中创建新日期(),javascript,Javascript,我有一个这种格式的日期:dd.mm.yyyy 当我用它实例化JavaScript日期时,它会给我一个NaN 在c#中,我可以指定一种日期格式,即:这里有我的字符串,它是这种格式,请为它指定一个日期时间 在JavaScript中也可以这样做吗?如果没有,有没有简单的方法 我不希望使用日的子字符串,月的子字符串等,因为我的方法还必须能够处理德语、意大利语、英语等日期。没有内置的方法来按照您希望的方式处理日期 具有您想要的功能,我相信许多其他库也有类似的功能 $.datepicker.parseDat
NaN
在c#中,我可以指定一种日期格式,即:这里有我的字符串,它是这种格式,请为它指定一个日期时间
在JavaScript中也可以这样做吗?如果没有,有没有简单的方法
我不希望使用日的子字符串,月的子字符串等,因为我的方法还必须能够处理德语、意大利语、英语等日期。没有内置的方法来按照您希望的方式处理日期 具有您想要的功能,我相信许多其他库也有类似的功能
$.datepicker.parseDate('dd.mm.yy', '31.12.2007');
您需要创建一个函数来提取日期部分,并将其与构造函数一起使用 请注意,此构造函数将月份视为基于零的数字(
0=Jan,1=Feb,…,11=Dec
)
例如:
function parseDate(input) {
var parts = input.match(/(\d+)/g);
// note parts[1]-1
return new Date(parts[2], parts[1]-1, parts[0]);
}
parseDate('31.05.2010');
// Mon May 31 2010 00:00:00
编辑:要处理变量格式,可以执行以下操作:
function parseDate(input, format) {
format = format || 'yyyy-mm-dd'; // default format
var parts = input.match(/(\d+)/g),
i = 0, fmt = {};
// extract date-part indexes from the format
format.replace(/(yyyy|dd|mm)/g, function(part) { fmt[part] = i++; });
return new Date(parts[fmt['yyyy']], parts[fmt['mm']]-1, parts[fmt['dd']]);
}
parseDate('05.31.2010', 'mm.dd.yyyy');
parseDate('31.05.2010', 'dd.mm.yyyy');
parseDate('2010-05-31');
上述函数接受一个格式参数,该参数应包括yyyy
mm
和dd
占位符,分隔符并不重要,因为RegExp只捕获数字
您还可以查看一个小型库,它使日期解析变得轻松…将字符串拆分为一个数组并将部分直接传递给日期对象非常简单:
var str = "01.01.2010";
var dmy = str.split(".");
var d = new Date(dmy[2], dmy[1] - 1, dmy[0]);
t=“01.01.1970”
部分=t.分割(“.”);
对于(var i=0;i
日期定义为(年、月、日)Date()的month参数以零为基的索引表示月份。一月=0,二月=1,三月=2。。。等
将字符串解析为int是没有必要的,但我不喜欢将字符串传递到函数中,只希望JavaScript能够“得到它”。。。有点像有些人喜欢的===接受答案的修改版本,它支持没有“dd”和大写格式的值和格式
function parseDate(input, format) {
format = (format || 'yyyy-mm-dd').toLowerCase(); // default format
var parts = input.match(/(\d+)/g),
i = 0, fmt = {};
// extract date-part indexes from the format
format.replace(/(yyyy|dd|mm)/g, function(part) { fmt[part] = i++; });
return new Date([parts[fmt['yyyy']], parts[fmt['mm']], parts[fmt['dd']]].filter(x => x !== undefined).join('-'));
}
parseDate('10/2018', 'MM/YYYY')
在CMS answer的基础上,我创建了这个函数来处理变量格式
function parseDate(input, format) {
format = format || 'yyyy-mm-dd'; // default format
//Change from PHP date format to JS
if (format == 'd/m/Y') {
format = 'dd/mm/yyyy';
}
if (format == 'd/m/Y H:i:s') {
format = 'dd/mm/yyyy hh:ii:ss';
}
let date = NaN;
if (format == 'dd/mm/yyyy') {
let parts = input.match(/(\d+)/g),
i = 0, fmt = {};
// extract date-part indexes from the format
format.replace(/(yyyy|dd|mm)/g, function(part) { fmt[part] = parts[i++]; });
//create date for new format
let createdDate = new Date(fmt['yyyy'], fmt['mm']-1, fmt['dd']);
//check if dates are equal by comparing parts. The issue I had here was
//when I passed an invalid value for month, the output was adjustement to
//accomodate for the extra months
if (
createdDate.getFullYear() == fmt['yyyy'] &&
createdDate.getMonth() == (fmt['mm']-1) &&
createdDate.getDate() == fmt['dd']
) {
date = createdDate;
}
}
//same but taking into account hours minute and seccond
if (format == 'dd/mm/yyyy hh:ii:ss') {
let parts = input.match(/(\d+)/g),
i = 0, fmt = {};
// extract date-part indexes from the format
format.replace(/(yyyy|dd|mm|hh|ii|ss)/g,
function(part) { fmt[part] = parts[i++]; });
let createdDate = new Date(
fmt['yyyy'], fmt['mm']-1, fmt['dd'],
fmt['hh'], fmt['ii'], fmt['ss']
);
if (
createdDate.getFullYear() == fmt['yyyy'] &&
createdDate.getMonth() == (fmt['mm']-1) &&
createdDate.getDate() == fmt['dd'] &&
createdDate.getHours() == fmt['hh'] &&
createdDate.getMinutes() == fmt['ii'] &&
createdDate.getSeconds() == fmt['ss']
) {
date = createdDate;
}
}
return date;
}
Date()的month参数以零为基的索引表示月份。一月=0,二月=1,三月=2。。。等等,这是我想要的,但是如果可能的话,没有整个datepicker库。所以我想要一个“may other Library”:-)@Michel签出jQuery UI使用的“datejs”datepicker@Pointy-太好了,我刚刚发现同样的东西DateJS从2008年起就被“抛弃”了。基于@Ben的观点,Moment有一种方法可以
parseInt
不需要(JavaScript的键入是动态的,字符串应该自动转换为数字)对于这样一个简单的操作,@Andy说的是,Date
构造函数将在内部转换参数。此外,在这里使用不带基数参数的parseInt
特别有害,因为您可以有一个日期,如“09.09.2010”
,和parseInt('09')==0
,因为前面的零将强制数字转换为八进制,内部ToNumber
操作不会发生这种情况。我想处理mm/dd/yyyy和dd/mm/yyyy!工作起来很有魅力!讨厌它,虽然我不知道它是如何工作的:)强大!DateJs是Rate。嗨,欢迎来到Stack Overflow,谢谢你的回答。虽然这个代码片段可能是解决方案,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。
function parseDate(input, format) {
format = format || 'yyyy-mm-dd'; // default format
//Change from PHP date format to JS
if (format == 'd/m/Y') {
format = 'dd/mm/yyyy';
}
if (format == 'd/m/Y H:i:s') {
format = 'dd/mm/yyyy hh:ii:ss';
}
let date = NaN;
if (format == 'dd/mm/yyyy') {
let parts = input.match(/(\d+)/g),
i = 0, fmt = {};
// extract date-part indexes from the format
format.replace(/(yyyy|dd|mm)/g, function(part) { fmt[part] = parts[i++]; });
//create date for new format
let createdDate = new Date(fmt['yyyy'], fmt['mm']-1, fmt['dd']);
//check if dates are equal by comparing parts. The issue I had here was
//when I passed an invalid value for month, the output was adjustement to
//accomodate for the extra months
if (
createdDate.getFullYear() == fmt['yyyy'] &&
createdDate.getMonth() == (fmt['mm']-1) &&
createdDate.getDate() == fmt['dd']
) {
date = createdDate;
}
}
//same but taking into account hours minute and seccond
if (format == 'dd/mm/yyyy hh:ii:ss') {
let parts = input.match(/(\d+)/g),
i = 0, fmt = {};
// extract date-part indexes from the format
format.replace(/(yyyy|dd|mm|hh|ii|ss)/g,
function(part) { fmt[part] = parts[i++]; });
let createdDate = new Date(
fmt['yyyy'], fmt['mm']-1, fmt['dd'],
fmt['hh'], fmt['ii'], fmt['ss']
);
if (
createdDate.getFullYear() == fmt['yyyy'] &&
createdDate.getMonth() == (fmt['mm']-1) &&
createdDate.getDate() == fmt['dd'] &&
createdDate.getHours() == fmt['hh'] &&
createdDate.getMinutes() == fmt['ii'] &&
createdDate.getSeconds() == fmt['ss']
) {
date = createdDate;
}
}
return date;
}