Safari中的日期无效

2020/10/27 23:23 · javascript ·  · 0评论
 alert(new Date('2010-11-29'));

chrome,ff对此没有问题,但是Safari会喊“无效日期”。为什么呢

编辑:好的,根据下面的评论,我使用了字符串解析并尝试了以下操作:

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完成此操作。Date-fns也非常轻巧。

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

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

  • MM-dd-yyyy
  • 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(一月)到12(十二月)的一年中的月份。
  • DD是当月的一天,从01到31。
  • “ T”字面上出现在字符串中,以指示时间元素的开始。
  • HH是自午夜以来已经过去的完整小时数,为两位十进制数字。
  • “:”(冒号)在字符串中实际出现两次。
  • mm是从小时开始算起的完整分钟数,用两位十进制数字表示。
  • ss是从分钟开始算起的完整秒数,以两位十进制数字表示。
  • “。” (点)字面上出现在字符串中。
  • sss是秒数开始以来的完整毫秒数,为三个十进制数字。这俩 ”。” 毫秒字段可以省略。
  • Z是指定为“ Z”(对于UTC)或“ +”或“-”的时区偏移量,后跟时间表达式hh:mm

此格式包括仅日期形式:

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

它还包括仅时间形式,并附加了可选的时区偏移量:

  • 高度:mm
  • THH:mm:ss
  • THH:mm:ss.sss

还包括“日期时间”,它可以是上述的任何组合。

因此,似乎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");

对我来说,仅仅因为Safari无法正确实现新库而实施一个新库就太多了,而正则表达式则显得过于刻板。这是oneliner

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

我面临着类似的问题。Date.Parse("DATESTRING")在Chrome(版本59.0.3071.115)上运行,但未在Safari(版本10.1.1(11603.2.5))上运行

苹果浏览器:

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

铬:

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

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

苹果浏览器:

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

铬:

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

请注意,来自Safari浏览器的响应比Chrome浏览器中的响应少8小时(28800000毫秒),因为Safari以本地TZ返回了响应(比世界标准时间晚8个小时)

在同一个TZ中获得两个时间

苹果浏览器:

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

铬:

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

我用片刻来解决问题。例如

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

要使解决方案适用于大多数浏览器,您应使用以下格式创建日期对象

(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开发人员中心:日期对象(JavaScript)

Mozilla开发人员网络:日期

将字符串从atat转换为Date(您必须知道服务器时区)

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

其中+08:00 =服务器的timeZone

我遇到了同样的问题。然后我用了片刻.J。问题消失了。

从字符串创建时刻时,我们首先检查字符串是否与已知的ISO 8601格式匹配,然后如果找不到已知格式,则退回到新的Date(string)。

警告:浏览器对字符串的支持不一致。因为没有关于应该支持哪种格式的规范,所以在某些浏览器中有效的格式在其他浏览器中无效。

为了获得一致的解析ISO 8601字符串以外的结果的结果,应使用字符串+格式。

例如

var date= moment(String);

尽管您可能希望浏览器支持ISO 8601(或其仅日期子集),但事实并非如此。我知道的所有浏览器(至少在我使用的美国/英语语言环境中)都可以解析可怕的美国MM/DD/YYYY格式。

如果您已经拥有日期的各个部分,则可能要尝试使用Date.UTC()如果不这样做,但必须使用YYYY-MM-DD格式,我建议使用正则表达式来解析您知道的片段,然后将其传递给Date.UTC()

使用以下格式,它将在所有浏览器上正常工作

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); 

//您的输出看起来像这样“ 2016年3月23日星期三00:00:00 GMT + 0530(IST)”

///请注意,在这种情况下,此时间段将在IST表示的当前时区中转换为UTC时区

alert(dateObj.toUTCSting);

//您现在的输出将是“ Tue,22 Mar 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”

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

如何劫持Date修复最新的无依赖性,最小值+ gzip = 280 B

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

new Date(year, month, day, hours, minutes, seconds, milliseconds)
var d = new Date(2018, 11, 24, 10, 33, 30, 0);

所有浏览器均支持此功能,不会给您任何问题。请注意,月份从0到11。

在Safari中面临相同的问题,并将其插入网页即可解决

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

希望它也能解决您的问题

谢谢

正如@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 

尽管我只是捕捉到错误并发回当前日期,但这并不是最佳解决方案。我个人觉得如果用户要使用不符合sh * t标准的浏览器,就不能解决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'));野生动物园无法正常使用这种处理日期格式的怪异/严格方法,alert(new Date(String('2010-11-29')));例如:

(要么)

使用Moment js可以解决问题,但是在ios 14之后,Safari变得更奇怪了

尝试以下警报(moment(String(“ 2015-12-31 00:00:00”)));

瞬间JS

使用格式“ mm / dd / yyyy”。例如:-new Date('02 / 28/2015')。它适用于所有浏览器。

本文地址:http://javascript.askforanswer.com/safarizhongderiqiwuxiao.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!