Date & Calendar
# Timestamp (Unix Time)
当前 Unix 时间 (opens new window) (time.is)
# Date
Data 这个类里面的构造器、方法基本都过时了。官方推荐使用 Calendar (抽象类)作为替代。
System.out.println(new Date());
打印结果类似于:“Thu Sep 29 16:38:03 CST 2022”。
当然
new java.util.Date()
是一个对象,它不可能长这样。这里“打印一个对象”利用的是toString()
方法。
java.util.Date()
自带了一个toString()
方法。
System.out.println(new Date(1664440683L * 1000)); // Thu Sep 29 16:38:03 CST 2022
提示
Date(long date) 可接受一个指定时间的参数。如果是 date
传的是 Unix 时间,则需要乘以 1000
。这是因为 date
参数以毫秒(millisecond)为单位。
使用 System.currentTimeMillis()
获取当前时间:
System.out.println(new Date(System.currentTimeMillis())); // Sat Oct 01 11:40:38 CST 2022
# 格式化日期 DateFormat
利用抽象类java.text.DateFormat
的子类java.text.SimpleDateFormat
来对日期格式化。
Date date = new Date(1664440683L * 1000);
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(dateFormat.format(date));
2
3
4
5
2022-09-29 16:38:03
# Calendar
Calendar 抽象类提供很多获取和设置时间的静态的日历字段(calendar field)。并且提供一个类方法(Calendar.getInstance()
)来生成一个实例(单例)。
Calendar rightNow = Calendar.getInstance(); // rightNow 对象表示当前时间
Calendar的
getInstance()
方法返回一个Calendar对象,该对象的Calendar字段已使用当前日期和时间进行初始化。也可以通过
int year = rightNow.get(Calendar.YEAR); // 年
int month = rightNow.get(Calendar.MONTH) + 1; // 月
int dayOfMonth = rightNow.get(Calendar.DAY_OF_MONTH); // 日
System.out.printf("%d/%d/%d", year, month, dayOfMonth); // 2022/9/30
int hour = rightNow.get(Calendar.HOUR); // 当前在哪个小时 - 12小时制
int hourOfDay = rightNow.get(Calendar.HOUR_OF_DAY); // 当前在哪个小时 - 24小时制
int date = rightNow.get(Calendar.DATE); // 当前月的天数
int dayOfWeek = rightNow.get(Calendar.DAY_OF_WEEK); // 今天是周几
int dayOfYear = rightNow.get(Calendar.DAY_OF_YEAR); // 今天是这一年的哪一天
2
3
4
5
6
7
8
9
10
11
提示
注意 Calendar.MONTH
通常需要 +1
。因为它是从 0
起始的,而像 Calendar.YEAR
或 Calendar.DAY_OF_MONTH
则不用 +1
。
MONTH 从 0
起始的原因可能是一个古老的问题,详见"你绝对想不到为什么计算月份是从 0 开始计数" (opens new window)
get()
方法返回给定calendar field的值。
使用 set()
方法设定日期:
rightNow.set(1314, 4, 20); // 月份会给出警告并建议以类似 Calendar.MAY 这样的字段形式表示
int year = rightNow.get(Calendar.YEAR); // 年
int month = rightNow.get(Calendar.MONTH) + 1; // 月(注意是 +1 了的)
int dayOfMonth = rightNow.get(Calendar.DAY_OF_MONTH); // 日
System.out.printf("%d/%d/%d\n", year, month, dayOfMonth); // 2022/9/30
System.out.println(rightNow); // toString()
2
3
4
5
6
7
8
注意
再次强调:当可以直接使用 System.out.println()
函数直接打印一个对象的时候,这个对象的类往往是具有 toString()
方法的
1314/5/20
java.util.GregorianCalendar[time=-20688598039456,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=1314,MONTH=4,WEEK_OF_YEAR=21,WEEK_OF_MONTH=4,DAY_OF_MONTH=20,DAY_OF_YEAR=140,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=11,HOUR_OF_DAY=23,MINUTE=12,SECOND=40,MILLISECOND=544,ZONE_OFFSET=28800000,DST_OFFSET=0]
2