狩猎日期无效

 alert(new Date('2010-11-29'));

Chrome,ff 对此没有问题,但狩猎队喊着“无效日期”。为什么?

Edit: ok,根据下面的注释,我使用了字符串解析并尝试了以下方法:

alert(new Date('11-29-2010')); //doesn't work in safari
alert(new Date('29-11-2010')); //doesn't work in safari
alert(new Date('2010-29-11')); //doesn't work in safari

编辑2018年3月22日 : 似乎人们仍然在这里着陆-今天,我会使用 momentdate-fns,并与它完成。枣-fns 是非常痛苦的免费和轻,以及。

222018 次浏览

模式yyyy-MM-dd不是官方支持的Date构造函数格式。Firefox似乎支持它,但别指望其他浏览器也能这么做。

下面是一些受支持的字符串:

  • ;
  • yyyy / MM / dd
  • MM / dd / yyyy
  • MMMM dd, yyyy
  • MMM dd, yyyy

DateJS似乎是一个解析非标准日期格式的好库。

编辑:刚刚检查了ecma - 262标准。引自15.9.1.15节:

日期时间字符串格式

ECMAScript定义了一个字符串 日期-时间交换格式 基于ISO的简化 8601扩展格式。格式为 YYYY-MM-DDTHH:mm:ss.sssZ 各字段的取值如下:

  • YYYY是公历年的十进制数字。
  • “产生绯闻;(连字符)在字符串中出现两次。
  • MM是从01(1月)到12(12月)之间的月份。
  • DD是一个月中的第一天,从01到31。
  • <李>“T"在字符串中逐字出现,以指示的开始 time元素。
  • HH是自午夜以来经过的完整小时数,以2表示 李小数位数。< / >
  • “:”;(冒号)在字符串中出现两次。
  • mm为从小时开始的完整分钟数 两个十进制数字
  • ss是从一分钟开始算起的完整秒数
  • “!”(点)在字符串中逐字出现。
  • sss是自开始操作以来的完整毫秒数 第二个是三个十进制数字。这两个 “!”毫秒字段可以 李被省略了。< / >
  • Z是时区偏移量,指定为"Z"(UTC)或"+"或“;产生绯闻; 后面跟着一个时间表达式hh:mm

此格式包括仅限日期的表单:

  • YYYY
  • YYYY-MM
  • YYYY-MM-DD

它还包括只有时间的表单 附加一个可选的时区偏移量:

  • THH:毫米
  • THH: mm: ss
  • THH: mm: ss.sss

还包括&;date-time &;哪一个

所以,YYYY-MM-DD似乎包含在标准中,但出于某种原因,Safari不支持它。

更新:在看完datejs文档之后,使用它,你的问题应该用这样的代码来解决:

var myDate1 = Date.parseExact("29-11-2010", "dd-MM-yyyy");
var myDate2 = Date.parseExact("11-29-2010", "MM-dd-yyyy");
var myDate3 = Date.parseExact("2010-11-29", "yyyy-MM-dd");
var myDate4 = Date.parseExact("2010-29-11", "yyyy-dd-MM");

虽然你可能希望浏览器支持ISO 8601(或其仅限日期的子集),但事实并非如此。我所知道的所有浏览器(至少在我使用的美国/英语地区)都能够解析可怕的美国MM/DD/YYYY格式。

如果你已经有了日期的部分,你可能想要尝试使用Date.UTC ()。如果你没有,但你必须使用YYYY-MM-DD格式,我建议使用正则表达式来解析你知道的片段,然后将它们传递给Date.UTC()

对我来说,仅仅因为Safari不能正确地执行一个新库就太多了,正则表达式是多余的。 下面是oneliner:

console.log (new Date('2011-04-12'.replace(/-/g, "/")));

要让解决方案在大多数浏览器上都能工作,您应该使用这种格式创建日期对象

(year, month, date, hours, minutes, seconds, ms)

例如:

dateObj = new Date(2014, 6, 25); //UTC time / Months are mapped from 0 to 11
alert(dateObj.getTime()); //gives back timestamp in ms

工作良好的IE, FF, Chrome和Safari。甚至是更老的版本。

IE Dev Center: Date Object (JavaScript)

Mozilla Dev Network: Date

我也有同样的问题。然后我使用moment.Js。问题已经消失了。

当从字符串创建moment时,我们首先检查字符串是否 匹配已知的ISO 8601格式,然后返回到新的日期(字符串)如果

.格式不存在

警告:浏览器对解析字符串的支持不一致。因为 没有关于应该支持哪种格式、支持什么格式的规范

.在某些浏览器中有效在其他浏览器中无效

为了解析除ISO 8601字符串以外的任何字符串的一致结果, 你应该使用字符串+格式。

如。

var date= moment(String);

使用'mm/dd/yyyy'格式。例如:- new Date('02/28/2015')。它在所有浏览器中都运行良好。

将字符串转换为日期格式(你必须知道服务器时区)

new Date('2015-06-16 11:00:00'.replace(/\s+/g, 'T').concat('.000+08:00')).getTime()

where +08:00 =时区从服务器

我用矩来解决问题。 例如< / p >

var startDate = moment('2015-07-06 08:00', 'YYYY-MM-DD HH:mm').toDate();

使用下面的格式,它可以在所有浏览器上工作

var year = 2016;
var month = 02;           // month varies from 0-11 (Jan-Dec)
var day = 23;


month = month<10?"0"+month:month;        // to ensure YYYY-MM-DD format
day = day<10?"0"+day:day;


dateObj = new Date(year+"-"+month+"-"+day);


alert(dateObj);

//你的输出看起来像这样“周三3月23日00:00:00 GMT+0530 (IST)”

//注意这将是在当前时区,在这种情况下由IST表示,转换为UTC时区,你可以包括

alert(dateObj.toUTCSting);

//你现在的输出是这样的“Tue, 22 march 2016 18:30:00 GMT”

请注意,现在dateObj以GMT格式显示时间,还请注意日期和时间已相应更改。

“toUTCSting”函数检索格林尼治子午线上的相应时间。它通过建立当前时区与格林威治子午线时区之间的时差来实现这一点。

在上面的例子中,转换前的时间是2016年3月23日00:00小时和分钟。在将GMT+0530 (IST)小时转换为GMT(在这种情况下,它基本上从给定的时间戳中减去5.30小时)后,时间反映了2016年3月22日的18.30小时(正好比第一次时间晚5.30小时)。

进一步将任何日期对象转换为您可以使用的时间戳

alert(dateObj.getTime());

//输出类似于"1458671400000"

这将为您提供时间的唯一时间戳

fix-date劫持Date怎么样?无依赖,min + gzip = 280 B

我也遇到过类似的问题。Date.Parse("DATESTRING")运行在Chrome (Version 59.0.3071.115)上,但不适用于Safari (Version 10.1.1 (11603.2.5))

Safari:

Date.parse("2017-01-22 11:57:00")
NaN

铬:

Date.parse("2017-01-22 11:57:00")
1485115020000

对我有效的解决方案是用"T"替换dateString中的空格。(例如:dateString.replace(/ /g,"T"))

Safari:

Date.parse("2017-01-22T11:57:00")
1485086220000

铬:

Date.parse("2017-01-22T11:57:00")
1485115020000

注意,Safari浏览器的响应比Chrome浏览器的响应少8hrs (28800000ms),因为Safari以本地TZ返回响应(比UTC晚8hrs)

得到相同TZ的两个时间

Safari:

Date.parse("2017-01-22T11:57:00Z")
1485086220000

铬:

Date.parse("2017-01-22T11:57:00Z")
1485086220000

在Safari中也面临同样的问题,它通过在网页中插入这个解决了

 <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script>

希望它也会对你的案子起作用

谢谢

最好的方法是使用以下格式:

new Date(year, month, day, hours, minutes, seconds, milliseconds)
var d = new Date(2018, 11, 24, 10, 33, 30, 0);
这在所有浏览器中都是支持的,不会给你任何问题。 请注意月份是从0到11。

正如@nizantz前面提到的,在Safari中使用Date.parse()对我来说不起作用。经过一番研究,我了解到File对象的lastDateModified属性已弃用,Safari不再支持它。使用File对象的lastModified属性解决了我的问题。当然不喜欢在网上发现不好的信息。

感谢所有在这篇文章中做出贡献的人,他们帮助我走上了我需要了解的问题的道路。如果没有这些信息,我可能永远也不会发现我的根本问题。也许这能帮助到和我处境相似的人。

我在Safari浏览器中也遇到了同样的问题

var date = new Date("2011-02-07");
console.log(date) // IE you get ‘NaN’ returned and in Safari you get ‘Invalid Date’

解决方案如下:

var d = new Date(2011, 01, 07); // yyyy, mm-1, dd
var d = new Date(2011, 01, 07, 11, 05, 00); // yyyy, mm-1, dd, hh, mm, ss
var d = new Date("02/07/2011"); // "mm/dd/yyyy"
var d = new Date("02/07/2011 11:05:00"); // "mm/dd/yyyy hh:mm:ss"
var d = new Date(1297076700000); // milliseconds
var d = new Date("Mon Feb 07 2011 11:05:00 GMT"); // ""Day Mon dd yyyy hh:mm:ss GMT/UTC

这不是最好的解决方案,尽管我只是捕获错误并返回当前日期。我个人觉得不解决Safari的问题,如果用户想要使用一个该死的不符合标准的浏览器——他们就得忍受这些怪癖。

function safeDate(dateString = "") {
let date = new Date();
try {
if (Date.parse(dateString)) {
date = new Date(Date.parse(dateString))
}
} catch (error) {
// do nothing.
}
return date;
}

我建议让你的后端发送ISO日期。

这将不起作用alert(new Date('2010-11-29')); safari有一些奇怪/严格的方式处理日期格式alert(new Date(String('2010-11-29')));试试这样。

(或)

使用Moment js可以解决这个问题,在ios 14之后,safari变得更加奇怪

试试这个alert(moment(String("2015-12-31 00:00:00")));

JS时刻

虽然迟到了,但在我们的情况下,我们在Safari &iOS时使用ES6反勾代替String()类型转换

这是给'无效日期'错误

const dateString = '2011-11-18';
const dateObj = new Date(`${dateString}`);

但这是可行的

const dateObj = new Date(String(dateString));
对我来说,问题是我忘记在YYYY-MM-DD格式的个位数月或日之前添加0
解析:2021-11-5
它应该是:2021-11-05

因此,我写了一个小工具,可以将YYYY-M-D转换为YYYY-MM-DD,即2021-1-1转换为2021-01-01:

const date = "2021-1-1"
const YYYY = date.split("-")[0];


//convert M->MM i.e. 2->02
const MM =
date.split("-")[1].length == 1
? "0" + date.split("-")[1]
: date.split("-")[1];


//convert D->DD i.e. 2->02
const DD =
date.split("-")[2].length == 1
? "0" + date.split("-")[2]
: date.split("-")[2];


// YYYY-MM-DD
const properDateString = `${YYYY + "-" + MM + "-" + DD}`;


const dateObj = new Date(properDateString);

对于使用date-fns的人,我们可以parseISO日期并使用它来格式化

无效的

import _format from 'date-fns/format';


export function formatDate(date: string, format: string): string {
return _format(new Date(date), format);
}

这个函数在safari中使用Invalid date抛出错误。

< p > 解决方案 < br > 要修复它,我们应该使用:

import _format from 'date-fns/format';
import _parseISO from 'date-fns/parseISO';


export function formatDate(date: string, format: string): string {
return _format(_parseISO(date), format);
}