java.util包下的Calendar和Date类来处理有关于时间操作.
java.util.Date
Date 类提供两个构造函数来实例化 Date 对象。
第一个构造函数使用当前日期和时间来初始化对象。
Date()
第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
Date(long millisec)
当调用无参构造方法时即为获取当前时间.
对于Date类常见的操作有时间的比较,按特定格式格式化Date,将String类型时间字符串转换为Date类型
1.日期比较
Java使用以下三种方法来比较两个日期:
- 使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值.
- 使用方法 before(Date date),after(Date date) 和 equals(Object object).
- 使用 compareTo() 方法.
方法定义如下:
boolean after(Date date)
若当调用此方法的Date对象在指定日期之后返回true,否则返回false
boolean before(Date date)
如当调用此方法的Date对象在指定日期之前返回true,否则反水false
int compareTo(Date anotherDate)
比较调用当前方法的Date对象和指定的anotherDate对象.相等返回0,调用对象在指定对象之前返回负数,反之返回正数
2.Date转换成指定格式的字符串
SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行
SimpleDateFormat的构造方法如下:
SimpleDateFormat(String pattern)
时间模式字符串常见的如下:
字母 | 描述 | 示例 |
---|
y | 四位年份 | 2001 |
M | 月份 | July or 07 |
d | 一个月的日期 | 10 |
h | A.M./P.M. (1~12)格式小时 | 12 |
H | 一天中的小时 (0~23) | 22 |
m | 分钟数 | 30 |
s | 秒数 | 55 |
S | 毫秒数 | 234 |
E | 星期几 | Tuesday |
D | 一年中的日子 | 360 |
F | 一个月中第几周的周几 | 2 (second Wed. in July) |
w | 一年中第几周 | 40 |
W | 一个月中第几周 | 1 |
a | A.M./P.M. 标记 | PM |
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat1.format(new Date());
System.out.println(format);//2018-06-25 17:12:22
3.时间类型字符串转换成Date对象
SimpleDateFormat 类有一些附加的方法,特别是parse(),它试图按照给定的SimpleDateFormat 对象的格式化存储来解析字符串。例如:
public static void main(String args[]) {
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
String input = "2018-06-25 17:12:22";
Date t;
try {
t = ft.parse(input);
System.out.println(t);
} catch (ParseException e) {
System.out.println("Unparseable using " + ft);
}
}
java.util.calendar
创建一个代表系统当前日期的Calendar对象
Calendar c = Calendar.getInstance();//默认是当前日期
创建一个指定日期的Calendar对象
使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。
//创建一个代表2009年6月12日的Calendar对象
Calendar c1 = Calendar.getInstance();
//c1.set(int year,int month,int day)
c1.set(2009, 6 - 1, 12);//month从0开始
Calendar类对象字段类型
Calendar类中用以下这些常量表示不同的意义,jdk内的很多类其实都是采用的这种思想
常量 | 描述 |
---|---|
Calendar.YEAR | 年份 |
Calendar.MONTH | 月份 |
Calendar.DATE | 日期 |
Calendar.DAY_OF_MONTH | 日期,和上面的字段意义完全相同 |
Calendar.HOUR | 12小时制的小时 |
Calendar.HOUR_OF_DAY | 24小时制的小时 |
Calendar.MINUTE | 分钟 |
Calendar.SECOND | 秒 |
Calendar.DAY_OF_WEEK | 星期几 |
如果只设定某个字段,例如日期的值,则可以使用如下set方法:
public void set(int field,int value)
实例:
calendar.set(Calendar.YEAR, 2017);
calendar.set(Calendar.MONDAY, 2);
calendar.set(Calendar.DATE, 30);
calendar.add(Calendar.MONDAY, 5);
Calendar类对象信息的获得
Calendar c1 = Calendar.getInstance();
// 获得年份
int year = c1.get(Calendar.YEAR);
// 获得月份
int month = c1.get(Calendar.MONTH) + 1;
// 获得日期
int date = c1.get(Calendar.DATE);
// 获得小时
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 获得分钟
int minute = c1.get(Calendar.MINUTE);
// 获得秒
int second = c1.get(Calendar.SECOND);
// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)
int day = c1.get(Calendar.DAY_OF_WEEK);
Calendar与Date对象的转换
Calendar-->Date
Calendar calendar=Calendar.getInstance();
Date time = calendar.getTime();
Date-->Calendar
Date date=new Date();
Calendar cal=Calendar.getInstance();
cal.setTime(date);
补充:
Calendar类实现了公历日历,GregorianCalendar是Calendar类的一个具体实现。
Calendar 的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象
在判断是否为闰年是可以使用isLeapYear(int year)
boolean isLeapYear(int year)
确定给定的年份是否为闰年。
实例:
public static void main(String[] args) {
//在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。
GregorianCalendar gregorianCalendar = new GregorianCalendar();
int year = gregorianCalendar.get(Calendar.YEAR);
if (gregorianCalendar.isLeapYear(year)) {
System.out.println("今年是闰年!");
} else {
System.out.println("今年不是闰年!");
}
}
Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。
在旧版的 Java 中,日期时间 API 存在诸多问题,其中有:
非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。
设计很差 − Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。
时区处理麻烦 − 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。
Java 8 在 java.time 包下提供了很多新的 API。以下为两个比较重要的 API:
Local(本地) − 简化了日期时间的处理,没有时区的问题。
Zoned(时区) − 通过制定的时区处理日期时间。
新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。
实例:
LocalDateTime now = LocalDateTime.now();
System.out.println("当期dateTime为:" + now);
LocalDate localDate = now.toLocalDate();
System.out.println("当前日期为 :" + localDate);
LocalTime localTime = now.toLocalTime();
System.out.println(localTime);
具体新特性参考java8 API.
----------------------分隔符
以上仅作个人学习,如有侵权请联系删除.谢谢
结尾语:
有志者、事竟成,破釜沉舟,百二秦关终属楚;
苦心人、天不负,卧薪尝胆,三千越甲可吞吴。