JavaScript中字符串和Date的相互转换
JavaScript中格式化日期需要自己写,字符串转Date对象的方法效果上也有点诡异,分别介绍如下。
1、Date转字符串
JavaScript没有像Java一样提供方便的格式化日期字符串,只能是我们自己写。这里先写了一个数字左补零的函数,然后调用这个函数对日期中的各个时间成分格式化后拼接。具体如下:
//将num左补0为len长度的字符串
function lpadNum(num, len) {
var l = num.toString().length;
while(l < len) {
num = "0" + num;
l++;
}
return num;
}
//将传入的Date格式化为"yyyyMMdd HH:mm:ss.SSS"
function formatDate(d){
var year = d.getFullYear();
var month = d.getMonth() + 1;
var day = d.getDate();
var hours = d.getHours();
var minutes = d.getMinutes();
var seconds = d.getSeconds();
var milliSeconds = d.getMilliseconds();
var resStr = year + lpadNum(month, 2) + lpadNum(day, 2) + " " + lpadNum(hours,2) + ":" + lpadNum(minutes,2) + ":" + lpadNum(seconds,2) + "." + lpadNum(milliSeconds, 3);
return resStr;
}
2、字符串转Date
2.1 介绍
2.1.1 语法
显式调用:
Date.parse(dateString)
隐式调用:
new Date(dateString)
2.1.2 参数
标准上来说,这个方法接收的参数是一个ISO 8601
格式的字符串(实际上ISO 8601
这个标准规定的时间格式非常送,这个函数也并不是所有的ISO 8601
格式的字符串都支持,而是只支持比较严格的那种)。其他的格式可能也能接受,但是各个浏览器平台的支持可能有差异。
For example, "2011-10-10" (date-only form), "2011-10-10T14:48:00" (date-time form), or "2011-10-10T14:48:00.000+09:00" (date-time form with milliseconds and time zone) can be passed and will be parsed. When the time zone offset is absent, date-only forms are interpreted as a UTC time and date-time forms are interpreted as local time.
比如,支持2011-10-10
(只有日期的时间形式)、2011-10-10T14:48:00
(日期带时间的时间形式)、2011-10-10T14:48:00.000+09:00
(日期带毫秒时间和时区偏移的时间形式),如果没有带时区偏移,那么只有日期的时间形式表示的是UTC
时间,日期带时间的形式表示的本地时间。
2.1.3 返回值
正常的话,这个函数返回从January 1, 1970, 00:00:00 UTC
到对应时间点的毫秒数。如果传入的字符串没有被正确识别,返回的就是NaN
2.2 例子
在苹果电脑上测试了两个浏览器Chrome和Safari,结果如下。
Chrome(版本 98.0.4758.102(正式版本) (x86_64)
):
formatDate(new Date(Date.parse("2022-02-13 15:16:19.450")));
'20220213 15:16:19.450'
formatDate(new Date(Date.parse("2022-02-13T15:16:19.450")));
'20220213 15:16:19.450'
Safari(版本13.0.3 (15608.3.10.1.4)
):
> formatDate(new Date(Date.parse("2022-02-13 15:16:19.450")));
< "NaN NaN:NaN:NaN.NaN"
> formatDate(new Date(Date.parse("2022-02-13T15:16:19.450")));
< "20220213 23:16:19.450"
从上面的结果看来,Chrome的支持比较灵活,但是Safari就不行,只支持严格的"2022-02-13T15:16:19.450"
格式(实际中也试过IE,运行效果和Safari一样)。
3、一个简单地获取服务器时间的jsp测试页面
代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
java.util.Date nowDate = new java.util.Date();
//java格式化时间的字符串中,如果有其他非格式字符要加单引号
java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
String nowDateStr = df.format(nowDate);
%>
<html>
<head>
<title>Test Javascript Date and Time</title>
</head>
<body>
</body>
<script language="JavaScript">
//将num左补0为len长度的字符串
function lpadNum(num, len) {
var l = num.toString().length;
while(l < len) {
num = "0" + num;
l++;
}
return num;
}
//将传入的Date格式化为"yyyyMMdd HH:mm:ss.SSS"
function formatDate(d){
var year = d.getFullYear();
var month = d.getMonth() + 1;
var day = d.getDate();
var hours = d.getHours();
var minutes = d.getMinutes();
var seconds = d.getSeconds();
var milliSeconds = d.getMilliseconds();
var resStr = year + lpadNum(month, 2) + lpadNum(day, 2) + " " + lpadNum(hours,2) + ":" + lpadNum(minutes,2) + ":" + lpadNum(seconds,2) + "." + lpadNum(milliSeconds, 3);
return resStr;
}
var serverTimeStr = "<%=nowDateStr%>";
console.log("ServerTimeStr:"+serverTimeStr);
console.log("ClientTimeStr:"+formatDate(new Date()));
var serverDate = new Date(Date.parse(serverTimeStr));
console.log("ServerTimeStr, reformatted:"+formatDate(serverDate));
</script>
</html>