给你一个格式化日期字符串,让你计算字符串表示的日期距离当年的一月一日有多少天
方法一:
public int dayOfYear(String date) {
//难点是一年中的每个月有多少天,好像只有2月不同
//判断是不是闰年,按照置闰法则:四年一闰,百年不闰,四百年再闰
String year = date.substring(0, 4);
int yearInt = Integer.parseInt(year);
int[][] month = new int[12][2];
if(yearInt%4 == 0){
if(yearInt % 100 == 0){
if(yearInt % 400 == 0){
month = new int[][]{{1,31},{2,29},{3,31},{4,30},{5,31},{6,30},{7,31},{8,31},{9,30},{10,31},{11,30},{12,31}};
}else{
month = new int[][]{{1,31},{2,28},{3,31},{4,30},{5,31},{6,30},{7,31},{8,31},{9,30},{10,31},{11,30},{12,31}};
}
}else{
month = new int[][]{{1,31},{2,29},{3,31},{4,30},{5,31},{6,30},{7,31},{8,31},{9,30},{10,31},{11,30},{12,31}};
}
}else{
month = new int[][]{{1,31},{2,28},{3,31},{4,30},{5,31},{6,30},{7,31},{8,31},{9,30},{10,31},{11,30},{12,31}};
}
int monthInt = Integer.parseInt(date.substring(5,7));
int dayInt = Integer.parseInt(date.substring(8,10));
int res = 0;
for(int i = 0; i < monthInt-1; i++){
res += month[i][1];
}
res += dayInt;
return res;
}
方法二:
使用Calendar、Date、SimpleDateFormat
//使用Calendar、date、SimpleDateFormat
//新建一个SimpleDateFormat对象,其日期字符串的格式为"yyyy-MM-dd";
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
try {
//将格式化日期字符串转化成Date对象
Date date=format.parse("2016-06-12");
//获得一个Calendar对象并设置时间为date代表的时间
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
System.out.println(calendar.getTime());
//获得当前Calendar对象距离1970.1.1 00:00的毫秒数
long timeInMillis = calendar.getTimeInMillis();
//将日期设为当年的一月一日
calendar.set(calendar.get(1),0,1);
System.out.println(calendar.getTime());
//直接计算天数
long days = (timeInMillis - calendar.getTimeInMillis()) / (1000*60*60*24);
System.out.println(days);
} catch (ParseException e) {
e.printStackTrace();
}
为什么不直接使用Date和SimpleDateFormat呢?
由于Calendar设置时间比Date更加直观和人性化,Calendar类中除了月份是0-11表示的,其他都和我们日常使用一样,Date类中的年起始是1900,月是0-11,日和正常一样,然后设置不像Calendar那么方便。最重要的,Date不是线程安全的。