分享一个将指定日期格式的字符串转为日期的js函数toDate

本文介绍了EasyUI DateTimeBox组件日期显示问题的解决方法,并提供了一个JavaScript函数用于将字符串转换为日期对象,支持自定义日期格式。包括问题概述、解决方案及日期格式转换代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天发现easyui的datetimebox不能正常显示日期,接着自然就是实现toDate的功能,google了下,没找到满意的,都写的很罗嗦。自己写一个,本来以为js的正则也可以用命名group来弄,但是目前看javascript好像不支持。现在实现的代码如下,希望对有需要的人也有帮助。


//by dragonimp 2015.5.3
//使用方法:
//"2015-5-5 9:10:10".toDate("yyyy-M-d hh:mm:ss")
//"2015/5/5 9:10:10".toDate("yyyy/M/d hh:mm:ss")
String.prototype.toDate = function (fmt) {
    if (fmt == null) fmt = 'yyyy-MM-dd hh:mm:ss';
    var str = this;
    //fmt为日期格式,str为日期字符串
    var reg = /([yMdhmsS]+)/g;//日期格式中的字符
    var key = {};
    var tmpkeys = fmt.match(reg);
    for (var i = 0 ; i < tmpkeys.length; i++) {
        key[tmpkeys[i].substr(0, 1)] = i + 1;
    }
    var r = str.match(fmt.replace(reg, "(\\d+)"));
    return new Date(r[key["y"]], r[key["M"]] - 1, r[key["d"]], r[key["h"]], r[key["m"]], r[key["s"]], r[key["S"]]);
}

附:easyui的问题和解决方法。

问题:

<input  type="text" value="2015/5/6 23:00:00" id="xxxx" class="easyui-datetimebox" />
这个显示出来的控件,日期的“日”部分显示不正确,会显示当天的日期。

检查了下,easyui已经引用了中文的资源文件,看了下资源文件,应该只支持"-"分割的日期,我这里是"/"

解决:需要自己实现formatter和parser。

1.加上options

<input  type="text" value="2015/5/6 23:00:00" id="xxxx" class="easyui-datetimebox" data-options="formatter:datetimebox_format,parser:datetimebox_parse" />

2.实现解析和格式化函数

function datetimebox_format(date) {
return date.toFormatString("yyyy/M/d h:mm:ss");
}
function datetimebox_parse(s) {  
return s.toDate("yyyy/M/d hh:mm:ss");  
}  

//a)转日期的,见前面我的toDate
//b)下面转字符串的,来自网上

Date.prototype.toFormatString = function (fmt) {
    var o = {
        "M+": this.getMonth() + 1,                 //月份 
        "d+": this.getDate(),                    //日 
        "h+": this.getHours(),                   //小时 
        "m+": this.getMinutes(),                 //分 
        "s+": this.getSeconds(),                 //秒 
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度 
        "S": this.getMilliseconds()             //毫秒 
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}


<think>好的,用户问的是如何在JavaScript中将对象转换为JSON字符串。首先,我需要确认用户的需求,他们可能遇到需要序列化对象的情况,比如存储数据或者与服务器通信。常见的转换方法是用JSON.stringify(),但用户可能不清楚具体用法或者会遇到一些问题。 然后,我想到要分步骤解释。首先介绍基本用法,直接使用JSON.stringify(obj),然后说明参数的作用,比如第二个参数是replacer函数,第三个参数控制缩进,这样用户可以根据需要格式化输出。同时,用户可能不知道这些高级用法,所以需要举例说明。 接下来,需要注意异常处理。比如对象中有循环引用时,JSON.stringify会报错,这时候需要用try...catch来捕获错误。参考引用[2]中的例子,用户可能遇到这个问题,所以需要提醒他们处理这种情况。 另外,用户可能尝试其他方法,比如直接调用对象的toString(),但这通常返回"[object Object]",并不实用。或者他们可能想用字符串拼接,但结果也不正确。需要指出这些方法的不足,并强调JSON.stringify的正确性。 还要提到特殊对象,比如Date或函数,在序列化时可能丢失信息,这时候需要自定义toJSON方法或者使用replacer函数来处理。不过这可能属于进阶内容,用户可能暂时不需要,但可以简要提及。 最后,确保回答符合系统指令,比如正确使用LaTeX格式,虽然这个问题可能用不上数学公式,但如果有变量名之类的,需要用$包裹。另外生成相关问题,比如处理循环引用、格式化输出、异常处理等,帮助用户深入理解。</think>在JavaScript中将对象转换为JSON字符串主要通过`JSON.stringify()`方法实现,以下是具体步骤和注意事项: ### 1. 基础用法 使用`JSON.stringify(obj)`可将对象转换为标准JSON字符串: ```javascript const obj = { name: 'Alice', age: 25 }; const jsonString = JSON.stringify(obj); console.log(jsonString); // 输出: {"name":"Alice","age":25} ``` 此方法会忽略函数、`undefined`和循环引用结构[^2]。 ### 2. 高级参数 `JSON.stringify()`支持自定义序列化规则: - **第二个参数(replacer)**:过滤或转换属性 ```javascript const filteredJson = JSON.stringify(obj, ['name']); // 仅保留name属性 ``` - **第三个参数(缩进空格数)**:格式化输出 ```javascript const prettyJson = JSON.stringify(obj, null, 2); // 2空格缩进 ``` ### 3. 异常处理 当对象包含**循环引用**时需捕获异常: ```javascript const cyclicObj = { selfRef: null }; cyclicObj.selfRef = cyclicObj; try { JSON.stringify(cyclicObj); } catch (error) { console.error('转换错误:', error); // 触发TypeError[^2] } ``` ### 4. 常见错误方法 - **直接类型转换**:`String(obj)`会返回无意义的`[object Object]` - **错误拼接**:`obj + ''`同样无法得到有效JSON - **修改只读属性**:如尝试修改字符串对象属性会报错[^3] ### 5. 特殊类型处理 对于`Date`对象、函数等特殊类型,建议: ```javascript const specialObj = { date: new Date(), toJSON: function() { return this.date.toISOString(); } }; JSON.stringify(specialObj); // 输出自定义日期格式 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值