Date对象在Safari与IOS中的“大坑”

news/2024/7/10 1:52:30 标签: vue

safari浏览器下解决Date日期的NAN问题

今天给大家分享一个我在工作中遇到的坑!

    我自己写代码都是在模拟器上面调试程序的嘛,今天测试把程序在IOS系统上面运行给我看,什么鬼!时间全部是NaN,android上没问题,我页面用的vue.js套的嘛,用了个过滤器,先上代码

  filters: {//时间过滤器
    formatDate(time) {
      /*let date = new Date(Date.parse(time.replace(/-/g, "/")));*/
      let date = new Date(time);
      return formatDate(date, 'yyyy-MM-dd');
      //此处formatDate是一个函数,将其封装在common/js/date.js里面,便于全局使用
    },
    formatDates(time) {
  let date = new Date(time);
  return formatDate(date, 'hh:mm:ss');
  //此处formatDate是一个函数,将其封装在common/js/date.js里面,便于全局使用
}
  }

我用的是一个自定义的过滤器,一看没问题呀,它在Firefox、Chrome中就能运行,但是放在Safari就会报错,错误是NaN,意思是Not a Number。就是因为这个错,苹果手机不能正常运行我开发的这个界面,当时都快郁闷死了,然后就去查资料发现

YYYY-MM-DD HH:MM:SS格式无法解析,需要转换成YYYY/MM/DD HH:MM:SS格式。在firefox和chrome中可以直接支持Date.parse(YYYY-MM-DD HH:MM:SS),但是safari无法支持;

我的解决方法是直接在后台就把格式转换了

public static void JsonTimestampToDateFmtValIOS(JsonConfig config) {
    config.registerJsonValueProcessor(Timestamp.class,
            new JsonValueProcessor() {
                @Override
                public Object processObjectValue(String arg0, Object arg1,
                                                 JsonConfig arg2) {
                    SimpleDateFormat sdf = new SimpleDateFormat(
                            "yyyy/MM/dd HH:mm:ss");
                    Timestamp t = (Timestamp) arg1;
                    if (t != null) {
                        return sdf.format(t);
                    }
                    return "";
                }

                @Override
                public Object processArrayValue(Object arg0, JsonConfig arg1) {
                    return null;
                }
            });
}
@RequestMapping
public  void getMyepuerPage(Long museId, HttpServletResponse response, HttpServletRequest request) throws BusiHandlerException {
    ResponseMsg rm=new ResponseMsg(ResponseMsg.TYPE_SUCCESS,"查询成功");
    try {
        PageBean<MemberEpurseLog,MemberEpurseLog> bean=this.getPageBean(request);
        this.appMyEpuerService.getMyepuerPage(museId,bean);
        rm.setResult(bean);
    } catch (Exception e) {
        e.printStackTrace();
        log.info("交易流水查询失败,原因:"+e.getMessage());
        rm=new ResponseMsg(ResponseMsg.TYPE_ERROR,"查询失败");
    }
    JsonConfig config=new JsonConfig();
    JsonToDateFmtUtil.JsonTimestampToDateFmtValIOS(config);
    config.setExcludes(new String[]{"memberUser"});
    this.outPrint(response,request, JSONObject.fromObject(rm,config).toString());
}
问题一:
网上是这样写的:var date =new Date("2016/05/31 08:00");
 
所以写一个函数,这样Android和IOS就能共用了,写了个函数,替换一下!

function GetDateDiff(startDiffTime, endDiffTime) {  
            //将xxxx-xx-xx的时间格式,转换为 xxxx/xx/xx的格式   
            startTime = startDiffTime.replace(/\-/g, "/");  
            endTime = endDiffTime.replace(/\-/g, "/");  
}; 
 问题二:
  HTML5中新增了日历控件,如果将控件的type=“datetime-local”,如果是Chrome,
控件的日期显示格式是2016/05/30 08:00 ,如果是Safari,日期的显示格式是:2016-05-31T08:00,
当我们用JQuery取值赋值的时候,就必须用这种方式才能赋值:假如说这个日历控件的id是timeDate,
代码如下:

$("#timeDate').val("2016-05-30T08:30");  
  用$("#timeDate').val("2016/05/30 08:30");就会报错。
可是Chrome的显示方式就是这样的啊!!!尼玛的还有天理吗?

  这两个坑肯定不光坑过我自己一个人,希望以后注意吧!

 

以下上来自网上的摘抄:

safari浏览器下解决Date日期的NAN问题

  1. var date = new Date(Date.parse(expireDate.replace(/-/g, "/")));  

 

第一,用正则表达式做简单的匹配有两种方式:

1.  如果只有个别JS文件,建议采用这种方式

new Date('2017-03-12'.replace(/-/g, "/")).format("yyyy-MM-dd hh:mm"); Date('2017-03-12'.replace(/-/g, "/")).format("yyyy-MM-dd hh:mm");

2. 提取一个共同的方法

function parseDate(input) {
  var parts = input.match(/(\d+)/g);
  return new Date(parts[0], parts[1]-1, parts[2]);
}

parseDate('2011-01-03'); // Mon Jan 03 2011 00:00:00

参照如下:new Date() using Javascript in Safari

new Date() using Javascript in Safari

up vote10down votefavorite

3

I'm having an issue using the new Date() function in Javascript. Safari is giving me an "Invalid Date" message.

I've created a short example at jsbin.

This appears to work on all other browsers, but not Safari. Any ideas on how I can take the value from an input (such as 2011-01-03) and turn it into a date object, while having it work properly in Safari?

Many thanks!

javascript jquery date safari new-operator

shareeditflag

edited Jan 7 '11 at 5:48

asked Jan 7 '11 at 5:21

Dodinas

2,192175489

 

add a comment

 

start a bounty

4 Answers

activeoldestvotes

up vote36down voteaccepted

The date parsing behavior on JavaScript is implementation-dependent, the ISO8601 format was recently added to the ECMAScript 5th Edition Specification, but this is not yet supported by all implementations.

I would recommend you to parse it manually, for example:

function parseDate(input) {
  var parts = input.match(/(\d+)/g);
  return new Date(parts[0], parts[1]-1, parts[2]);
}

parseDate('2011-01-03'); // Mon Jan 03 2011 00:00:00

Basically the above function matches each date part and uses the Date constructor, to build a date object, note that the months argument needs to be 0-based (0=Jan, 1=Feb,...11=Dec).

shareeditflag

answered Jan 7 '11 at 6:45

CMS

469k129769772

 
  
  

This did it. Thanks for the clarification. – Dodinas Jan 7 '11 at 8:01

 

 

 

 

 

 

第二,引入DateJS格式化标准日期库   参考:DateJS

 

 

var currentDate = Date.parseExact("2017-01-12", "dd-MM-yyyy"); currentDate = Date.parseExact("2017-01-12", "dd-MM-yyyy");

 

 


http://www.niftyadmin.cn/n/1251979.html

相关文章

传奇数据库服务器显示10048,传奇,解决方案,服务端关于-传奇服务端-M2报错的基础解决方案 - Welcome to XiongTianQi.CN...

相信大家在架设传奇私服游戏的时候,会经常在M2启动的时候,出现卡主或者报错的情况,一般新手遇见传奇私服M2报错很棘手.在今天的教程中,就带领大家认识和解决传奇私服M2报错方法.(注:一般出现报错的传奇私服M2是免费版本,商业版本几乎没有此问题的出现,当然,你能解决报错的问题,…

Mapper.xml详解

我们知道&#xff0c;每一款框架产品在实际开发中&#xff0c;都是通过XML文件来培训框架的相关流程的&#xff0c;MyBatis也不例外&#xff0c;主要有两个配置文件&#xff1a;config.xml和Mapper.xml&#xff0c;当然&#xff0c;这两种配置文件可以自定义文件名。config.xml…

施乐700彩机服务器维修,施乐700DCP彩色数码复印机维修手册:700dcp_sc_ver1.1_chap05(208页)-原创力文档...

第五章 零件表5 零件表5.1 序文 PL 6.8 2ND BTR Roll Assembly (1 of 2) 385.1.1 零件表的用法 5 PL 6.9 2ND BTR Roll Assembly (2 of 2) 395.1.2 注意事项 5 PL 6.10 IBT Drawer 405.1.3 Plate 的构成 67. Fuser,Decurler5.1.4 术语符号的说明 6PL 7.1 Fuser Unit 415.1.5 使…

IntelliJ IDEA 构建maven,并用Maven创建一个web项目

打开IDEA&#xff0c;创建新项目&#xff1a; 然后选择Maven&#xff0c;以及选择自己电脑的jdk&#xff1a; 接下来自定义GroupId以及ArtifactId&#xff0c;这里只是demo&#xff0c;所以随便命名了 然后自定义项目名&#xff0c;Finish&#xff1a; maven创建完毕 先配置好…

餐厅收费服务器密码修改,餐厅消费管理系统-会所一卡通管理系统

英冠餐厅消费管理系统 -娱乐会所一卡通管理系统由于会所一般涉及到的消费项目多种多样&#xff0c;涵盖茶楼、棋牌、台球室、乒乓球、浴足保健、壁求、美容、网吧、游泳池、健身房、儿童中心等。消费者进入会所后&#xff0c;往往周转于各消费点&#xff0c;这样往往会造成用户…

kindeditor 复制粘贴 去除格式 设置

设置&#xff1a;pasteType : 1 就可以了 pasteType函数&#xff0c;默认值是2&#xff0c;设置为1 粘贴类型&#xff1a;0&#xff08;禁止粘贴&#xff09;&#xff0c;1&#xff08;纯文本粘贴&#xff09;&#xff0c;2&#xff08;HTML粘贴&#xff09;<link rel&quo…

jstl标签实现文字过长隐藏显示问题

当文字过长引起显示问题的时候我们可以将过长的文字隐藏起来一部分&#xff0c;鼠标移动过去显示出来 需要用到的jstl标签有 <% taglib prefix"c" uri"http://java.sun.com/jsp/jstl/core"%> <% taglib uri"http://java.sun.com/jsp/jstl…

自学Javase方法执行内存分析

菜鸟自学Javase方法执行内存分析 规则&#xff1b;自上而下依次执行&#xff0c;当前这行的代码没有结束时候&#xff0c;下一行代码不可能被执行 执行顺序结果 &#xff0c;一切从主方法开始&#xff0c;m1要结束必须等m2先结束&#xff0c;但是m2&#xff0c;想结束又要等m3先…