目录
一、java.util.Date
public static void main(String[] args)
{
// 获取当前时间:
Date date = new Date();
System.out.println(date.getYear() + 1900); // 必须加上1900
System.out.println(date.getMonth() + 1); // 0~11,必须加上1
System.out.println(date.getDate()); // 1~31,不能加1
// 转换为String:
System.out.println(date.toString());
// 转换为GMT时区:
System.out.println(date.toGMTString());
// 转换为本地时区:
System.out.println(date.toLocaleString());
// 获取指定Date对象的时间戳
System.out.println(date.getTime());
}
测试输出:
2019
10
28
Mon Oct 28 15:48:04 CST 2019
28 Oct 2019 07:48:04 GMT
2019-10-28 15:48:04
1572248884000
从上述的测试可以发现:
1.getYear()
返回的年份必须加上1900
2.getMonth()
返回的月份是0
~11
分别表示1~12月,所以要加1
3.getDate()
返回的日期范围是1
~31
,又不能加1
4.Date
不能转换时区,除了toGMTString()
可以按GMT+0:00
输出外,Date
总是以当前计算机系统的默认时区为基础进行输出。
5.Date可以直接通过getTime()方法转化为long型的毫秒值。
二、java.text.SimpleDateFormat
为了精确地控制日期和时间的输出格式,可以使用SimpleDateFormat来对Date进行格式转换。
预定义的格式化字符串如下:
- yyyy:年
- MM:月
- dd: 日
- HH: 小时
- mm: 分钟
- ss: 秒
public static void main(String[] args)
{
// 获取当前时间:
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(date));
Date d = sdf.parse("2019-11-11 20:30:28");
System.out.println(d);
}
测试输出:
2019-10-28 15:48:04
1573475428000
从上述的测试可以发现:
1.SimpleDateFormat经常搭配Date一起使用,默认使用
"yyyy-MM-dd HH:mm:ss"的输出格式。
2. SimpleDateFormat的parse方法可以将指定格式的时间串转化为Date对象。
三、java.util.Calendar
public static void main(String[] args)
{
System.out.println(new Date());
// 获取当前时间:
Calendar c = Calendar.getInstance();
int y = c.get(Calendar.YEAR);
int m = 1 + c.get(Calendar.MONTH);
int d = c.get(Calendar.DAY_OF_MONTH);
int w = c.get(Calendar.DAY_OF_WEEK);
int hh = c.get(Calendar.HOUR_OF_DAY);
int mm = c.get(Calendar.MINUTE);
int ss = c.get(Calendar.SECOND);
int ms = c.get(Calendar.MILLISECOND);
System.out.println(y + "-" + m + "-" + d + " " + w + " " + hh + ":" + mm + ":" + ss + "." + ms);
}
测试输出:
Mon Oct 28 16:39:56 CST 2019
2019-10-28 2 16:39:56.666
从上述的测试可以发现:
1.Calendar
获取年月日这些信息变成了get(int field)
2.
返回的年份不必转换
3.
返回的月份仍然要加1
4.
返回的星期要特别注意,1
~7
分别表示周日,周一,……,周六。
5.Calendar
只有一种方式获取,即Calendar.getInstance()
,而且一获取到就是当前时间
如果我们想设置一个特定的日期和时间,就必须先清除所有字段:
public static void main(String[] args)
{
// 当前时间:
Calendar c = Calendar.getInstance();
// 清除所有:
c.clear();
// 设置2019年:
c.set(Calendar.YEAR, 2019);
// 设置10月:注意9表示10月:
c.set(Calendar.MONTH, 10 - 1);
// 设置28日:
c.set(Calendar.DATE, 28);
// 设置时间:
c.set(Calendar.HOUR_OF_DAY, 17);
c.set(Calendar.MINUTE, 30);
c.set(Calendar.SECOND, 31);
Date d = c.getTime();
System.out.println(d);
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d));
// 2019-10-28 17:30:31
}
测试输出:
Mon Oct 28 17:30:31 CST 2019
2019-10-28 17:30:31
从上述的测试可以发现:
1.
利用Calendar.getTime()
可以将一个Calendar
对象转换成Date
对象,然后就可以用SimpleDateFormat
进行格式化了。
四、java.util.TimeZone
public static void main(String[] args)
{
// 当前时区
TimeZone tzDefault = TimeZone.getDefault();
// GMT+9:00时区
TimeZone tzGMT9 = TimeZone.getTimeZone("GMT+09:00");
// 纽约时区
TimeZone tzNY = TimeZone.getTimeZone("America/New_York");
System.out.println(tzDefault.getID());
// Asia/Shanghai
System.out.println(tzGMT9.getID());
// GMT+09:00
System.out.println(tzNY.getID());
// America/New_York
}
测试输出:
Asia/Shanghai
GMT+09:00
America/New_York
从上述的测试可以发现:
1.
时区的唯一标识是以字符串表示的ID,我们获取指定TimeZone
对象也是以这个ID为参数获取,GMT+09:00
、Asia/Shanghai
都是有效的时区ID。
2.
要列出系统支持的所有ID,请使用TimeZone.getAvailableIDs()
。
对指定时间进行时区转换:
public static void main(String[] args)
{
// 当前时间,默认系统时区
Calendar c = Calendar.getInstance();
// 清除所有,时区不变
c.clear();
// 设置为北京时区:
c.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
// 设置年月日时分秒:
c.set(2019, 10 /* 11月 */, 20, 8, 15, 0);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.getTimeZone());
System.out.println(sdf.format(c.getTime()));
// 2019-11-20 08:15:00
// 更改时区
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
System.out.println(sdf.getTimeZone());
System.out.println(sdf.format(c.getTime()));
// 2019-11-20 09:15:00
}
测试输出:
sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]
2019-11-20 08:15:00
sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null]
2019-11-20 09:15:00
从上述的测试可以发现:
1.
时区转换是通过设置SimpleDateFormat
的setTimeZone()方法来完成的。
2.Calendar 一般都采用
Calendar.getInstance()来获取实例,默认时区为系统时区;可通过 setTimeZone() 来修改。
Calendar
也可以对日期和时间进行简单的加减:
public static void main(String[] args)
{
// 当前时间:
Calendar c = Calendar.getInstance();
// 清除所有:
c.clear();
// 设置年月日时分秒:
c.set(2019, 10 /* 11月 */, 20, 8, 15, 0);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(c.getTime()));
// 2019-11-20 08:15:00
// 加5天并减去2小时:
c.add(Calendar.DAY_OF_MONTH, 5);
c.add(Calendar.HOUR_OF_DAY, -2);
System.out.println(sdf.format(c.getTime()));
// 2019-11-25 6:15:00
}
测试输出:
2019-11-20 08:15:00
2019-11-25 06:15:00