引言
在了解Date的用法之前,首先对
GMT,UTC,CST时间做一定了解。
-
格林威治标准时间
GMT: 以格林威治为起点,每隔经度15°,时差1小时,将全球划分24个时区,北京为GMT+8。 -
世界协调时间
UTC: 利用原子钟计算时间,几乎可以认为UTC=GMT,但UTC更精准。在UTC中,每一年或两年会有一个闰秒,而我们一般不理会这个“闰秒”,但是在Java中,这造成我们有时会出现60秒或61秒。 -
中央标准时间
CST:需注意java后台与客户端用的不是同一种CST。
美国cst时间:零时区(GMT)减6个小时
Central Standard Time (USA) UT-6:00
澳大利亚cst:加9个半小时
Central Standard Time (Australia) UT+9:30
中国cst:加8个小时
China Standard Time UT+8:00
古巴cst:减4个小时
Cuba Standard Time UT-4:00
总结:可通过GMT或UTC获取格林威治时间,可通过GMT+时区时间获取当地时间,如北京为GMT+8:00。
//java语言下
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ"); //Z为时区
System.out.println("本地时间:"+simpleDateFormat.format(new Date()));
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("格林威治时间:"+simpleDateFormat.format(new Date()));
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+09:00"));
System.out.println("东京时间:" +simpleDateFormat.format(new Date()));
//打印结果
本地时间:2020-11-05 16:58:11+0800
格林威治时间:2020-11-05 08:58:11+0000
东京时间:2020-11-05 18:02:05+0900
js创建时间
- 获取
当前日期时间
var now=new Date();
console.log(now.toLocaleString());
//打印结果
2020-11-6 11:14:08
- 根据
特定的日期和时间创建Date对象
- 给parse(
patternStr)函数传入日期格式的字符串获取毫秒值,再传给new Date(msecond)。注:也可直接向new Date(patternStr)传入日期格式字符串,两者效果相同。
var now=new Date(Date.parse("2018-01-14 12:24:00"));
var cur=new Date("2018/12/24")
console.log(now);
console.log(cur );
//打印结果
2018-01-14T04:24:00.000Z
2018-12-23T16:00:00.000Z
因国家不同,浏览器解析Date时可能对日期格式的要求有所不同
- 给
UTC函数传参获取毫秒值,依次传参:UTC(year,month,day,hour,minute,second,msecond),再通过new Date()获取。
year:格式yyyy,必填,如2018.
month:可填范围0 ~ 11,其中0代表1月,依次递增,必填。
day:可填范围1 ~31,选填,不填时默认为1。
hour:24小时制,选填,不填时默认为0.
minute和second:选填,默认为0。
var now=new Date(Date.UTC(2018,0));
var cur=new Date(Date.UTC(2018,2,25,14,6,38));
console.log(now);
console.log(cur );
//打印结果
2018-01-01T00:00:00.000Z
2018-03-25T14:06:38.000Z
也可以直接把这些参数传入new Date()中:
var now=new Date(2018,0);
var cur=new Date(2018,2,25,14,6,38);
console.log(now);
console.log(cur );
//打印结果
2017-12-31T16:00:00.000Z
2018-03-25T06:06:38.000Z
now()函数当前毫秒值:Date.now().
toString,toLocalString和valueOf函数
toString:返回带日期和时区的字符串
var cur=new Date(2018,2,25,14,6,38);
console.log(cur.toString());
//打印结果
Sun Mar 25 2018 14:06:38 GMT+0800 (GMT+08:00)
toLocalString:按与浏览器相适应的时区的日期格式返回。
var cur=new Date(2018,2,25,14,6,38);
console.log(cur.toLocaleString());
//打印结果
2018-3-25 14:06:38
valueOf:返回毫秒值,所以两个时间可以直接比较,因为它们在比较前调用了valueOf方法。
var cur=new Date(2018,2,25,14,6,38);
var now=new Date("2017-02-26 12:25:33");
console.log("cur的毫秒值:"+cur.valueOf());
console.log("cur>now: "+(cur>now));
//打印结果
cur的毫秒值:1521957998000
cur>now: true
- 常见的日期时间
组件方法。获取本地时间的年 月 日 时 分 秒 毫秒的值
var cur=new Date(2018,2,25,14,6,38); //0~11代表1月~12月
var year=cur.getFullYear();
var month=cur.getMonth();
var day=cur.getDate();
var hour=cur.getHours();
var minutes=cur.getMinutes();
var seconds=cur.getSeconds();
var mseconds=cur.getMilliseconds();
console.log("时间为:"+year+"-"+(month+1)+"-"+day+" "+hour+":"+minutes+":"+seconds+":"+mseconds);
//打印结果
时间为:2018-3-25 14:6:38:0
获取格林威治时间的年 月 日 时 分 秒 毫秒的值
//-8小时
var cur=new Date(2018,2,25,14,6,38); //0~11代表1月~12月
var year=cur.getUTCFullYear();
var month=cur.getUTCMonth();
var day=cur.getUTCDate();
var hour=cur.getUTCHours();
var minutes=cur.getUTCMinutes();
var seconds=cur.getUTCSeconds();
var mseconds=cur.getUTCMilliseconds();
console.log("时间为:"+year+"-"+(month+1)+"-"+day+" "+hour+":"+minutes+":"+seconds+":"+mseconds);
//打印结果
时间为:2018-3-25 6:6:38:0
获取日期中处于某星期的星期几
var cur=new Date(2018,2,25,14,6,38); //0~11代表1月~12月
var week=cur.getDay();
var arr=["星期一","星期二","星期三","星期四","星期五","星期六","星期天"]
console.log("本地时间是:"+arr[week]);
var weekUTC=cur.getUTCDay();
console.log("格林威治时间是:"+arr[weekUTC]);
//打印结果
本地时间是:星期一
格林威治时间是:星期一
总结: 除了计算小时外,get和getUTC的方法结果是一致的,因为只有小时涉及了时区的概念。
自定义时间格式化
为了解决不同的浏览器对js代码的解析机制不一致,可自定义格式化方法
function formateDate(date, format) {
var o = {
"M+": date.getMonth() + 1, //month
"d+": date.getDate(), //day
"h+": date.getHours(), //hour
"m+": date.getMinutes(), //minute
"s+": date.getSeconds(), //second
"q+": Math.floor((date.getMonth() + 3) / 3), //quarter
S: date.getMilliseconds(), //millisecond
};
if (/(y+)/.test(format))
format = format.replace(
RegExp.$1,
(date.getFullYear() + "").substr(4 - RegExp.$1.length)
);
for (var k in o)
if (new RegExp("(" + k + ")").test(format))
format = format.replace(
RegExp.$1,
RegExp.$1.length == 2
? o[k]
: ("00" + o[k]).substr(("" + o[k]).length)
);
return format;
}
console.log(formateDate( new Date(Date.now()),"yyyy/MM/dd hh:mm:ss"));
//打印结果
2020/12/7 15:10:39
对上面代码需要的注意的是:
RegExp.$1: 正则表达式中用各个()括起来的部分为各个捕获组的表达式,而可通过RgeExp.$1,$2,$3.....获取各个捕获组匹配的结果。
定义的对象
o,以正则表达式字符串作为对象的属性,如:M+,d+.