在开发中经常会使用到一些日期方面的操作,下面例子展示几个常用的操作。
1、取得指定日期是星期几
取得指定日期是星期几可以采用下面两种方式取得日期是星期几:
a、使用Calendar类
- //根据日期取得星期几
- public static String getWeek(Date date){
- String[] weeks = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
- Calendar cal = Calendar.getInstance();
- cal.setTime(date);
- int week_index = cal.get(Calendar.DAY_OF_WEEK) - 1;
- if(week_index<0){
- week_index = 0;
- }
- return weeks[week_index];
- }
b、使用SimpleDateFormat类
- //根据日期取得星期几
- public static String getWeek(Date date){
- SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
- String week = sdf.format(date);
- return week;
- }
注:格式化字符串存在区分大小写
对于创建SimpleDateFormat传入的参数:EEEE代表星期,如“星期四”;MMMM代表中文月份,如“十一月”;MM代表月份,如“11”;
yyyy代表年份,如“2010”;dd代表天,如“25”
2、取得日期是某年的第几周
根据日期入得日期是某年的第几周。
- //取得日期是某年的第几周
- public static int getWeekOfYear(Date date){
- Calendar cal = Calendar.getInstance();
- cal.setTime(date);
- int week_of_year = cal.get(Calendar.WEEK_OF_YEAR);
- return week_of_year;
- }
3、得到某年的某个月有多少天
已知年份和月份,取得该月有多少天。
- //取得某个月有多少天
- public static int getDaysOfMonth(int year,int month){
- Calendar cal = Calendar.getInstance();
- cal.set(Calendar.YEAR, year);
- cal.set(Calendar.MONTH, month-1);
- int days_of_month = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
- return days_of_month;
- }
4、取得两个日期之间的相差多少天
已知两个日期,计算它们之间相差多少天。
- <pre name="code" class="java">// 取得两个日期之间的相差多少天
- public static long getDaysBetween(Date date0, Date date1) {
- long daysBetween = (date0.getTime() - date1.getTime() + 1000000) / 86400000;// 86400000=3600*24*1000 用立即数,减少乘法计算的开销
- return daysBetween;
- }</pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
5、完整的测试代码
- package org.ml.test;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Date;
- public class CalendarDemo {
- public static void main(String[] args) {
- String strDate = "2013-03-08";// 定义日期字符串
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");// 定义日期格式
- Date date = null;
- try {
- date = format.parse(strDate);// 将字符串转换为日期
- } catch (ParseException e) {
- System.out.println("输入的日期格式不合理!");
- }
- System.out.println(strDate + "是:" + getWeek(date));
- System.out.println(strDate + "是一年的第:" + getWeekOfYear(date) + "周");
- System.out.println(strDate + "是一年的" + (date.getMonth() + 1) + "月有:"
- + getDaysOfMonth(date.getYear(), date.getMonth() + 1) + "天");
- System.out.println(strDate + "距离" + (format.format(new Date())) + "还有"
- + getDaysBetween(date, new Date()) + "天");
- }
- // 根据日期取得星期几
- public static String getWeek(Date date) {
- // String[] weeks = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
- // Calendar cal = Calendar.getInstance();
- // cal.setTime(date);
- // int week_index = cal.get(Calendar.DAY_OF_WEEK) - 1;
- // if(week_index<0){
- // week_index = 0;
- // }
- // return weeks[week_index];
- SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
- String week = sdf.format(date);
- return week;
- }
- // 取得日期是某年的第几周
- public static int getWeekOfYear(Date date) {
- Calendar cal = Calendar.getInstance();
- cal.setTime(date);
- int week_of_year = cal.get(Calendar.WEEK_OF_YEAR);
- return week_of_year;
- }
- // 取得某个月有多少天
- public static int getDaysOfMonth(int year, int month) {
- Calendar cal = Calendar.getInstance();
- cal.set(Calendar.YEAR, year);
- cal.set(Calendar.MONTH, month-1);
- int days_of_month = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
- return days_of_month;
- }
- // 取得两个日期之间的相差多少天
- public static long getDaysBetween(Date date0, Date date1) {
- long daysBetween = (date0.getTime() - date1.getTime() + 1000000) / 86400000;// 86400000=3600*24*1000 用立即数,减少乘法计算的开销
- return daysBetween;
- }
- }
6、测试结果
7、引出的问题
看下面的代码:
- public static void main(String[] args) throws Exception{
- String strDate = "999-999-999";// 定义日期字符串
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");// 定义日期格式
- Date date = null;
- try {
- date = format.parse(strDate);// 将字符串转换为日期
- } catch (ParseException e) {
- System.out.println("日期格式有误,请给出正确的日期格式");
- return;
- }
- System.out.println(format.format(date));
- }
Java中使用yyyy-MM-dd日期格式进行转换,转换字符串为999-999-999时,没有出现异常,反倒是执行通过了。
运行结果:1084-11-23
解决办法如下:
在date = format.parse(strDate)前面加上format.setLenient(false)就行了。意思是【指定日期/时间解析是否不严格。进行不严格解析时,解析程序可以使用启发式的方法来解释与此对象的格式不精确匹配的输入。进行严格解析时,输入必须匹配此对象的格式。 】