(color{#FF0000}{教训})
(color{#FF00FF}{不要用Date来计算两个Date相差的年份。})
(color{#FF7D00}{
例如:1814/09/06 2014/09/06
最初我以为是相差天数就是20*365(但是忽略的闰年366天的存在)
所以很多博客中都只提到了两个日期相差ms、s、min、hour、day})
ms=date1.getTime()-date2.getTime();
s=ms/1000; (date1.getTime()-date2.getTime())/(1000);
min=s/60; (date1.getTime()-date2.getTime())/(1000*60);
hour=min/60; (date1.getTime()-date2.getTime())/(1000*60*60);
day=hour/24; (date1.getTime()-date2.getTime())/(1000*60*60*24);
year=day/365;//这是错的
如果要计算相差年份可以将其转为字符串,判断相差年份是否超过n年
bug代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Main {
public static void main(String[] args) throws ParseException, IOException {
BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/mm/dd");
// long l = (sdf.parse("2014/09/06").getTime() - sdf.parse("1814/09/06").getTime()) / (1000 * 3600 * 24);
// System.out.println("相差天数:"+l);
// String nowStr="2014/09/06";
// String beforeStr="2014/09/16";
// long l = (sdf.parse(beforeStr).getTime() - sdf.parse(nowStr).getTime()) / (1000 * 3600 * 24);
// System.out.println(l);
String nowStr="2014/09/06";
Date now=sdf.parse(nowStr);
int cnt=0;
Map<Date,String> map= new TreeMap<>();
int n=Integer.parseInt(sc.readLine());
for(int i=0;i<n;i++){
String []s=sc.readLine().split(" ");
String value=s[0];
String key=s[1];
// System.out.println(key);
String []str=key.split("/");
if(Integer.parseInt(str[0])>2014){
continue;
}
//1000 * 24 * 60 * 60
// long time=now.getTime()-sdf.parse(key).getTime();//ms
// if((time/ (1000*3600*24)>365*200)){
// System.out.println("相差天数: "+time/ (1000*3600*24));
// continue;
// }
if(Integer.parseInt(str[0])<1814){
continue;
}
if(Integer.parseInt(str[0])==1814){
if(Integer.parseInt(str[1])<9){
continue;
}
if(Integer.parseInt(str[1])==9){
if(Integer.parseInt(str[2])<6){
continue;
}
}
}
map.put(sdf.parse(key),value);
cnt++;
}
if(map.size()==0){
System.out.println("0");return;
}
int num=0;
System.out.print(cnt+" ");
for(Map.Entry<Date,String> m:map.entrySet()){
Date key=m.getKey();
String value=m.getValue();
num++;
if(num==1){
System.out.print(value+" ");
}
if(num==cnt){
System.out.println(value);
// return;
}
//System.out.println(sdf.format(key)+" :"+value);
}
}
}
两个测试点没过:
//打印沙漏
//an=2n-1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Main {
public static void main(String[] args) throws ParseException, IOException {
BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/mm/dd");
String nowStr="2014/09/06";
Date now=sdf.parse(nowStr);
int cnt=0;
Map<Date,String> map= new TreeMap<>();
int n=Integer.parseInt(sc.readLine());
for(int i=0;i<n;i++){
String []s=sc.readLine().split(" ");
String value=s[0];
String key=s[1];
String []str=key.split("/");
//年份比现在还晚
if(Integer.parseInt(str[0])>2014){
continue;
}
if(Integer.parseInt(str[0])==2014){
if(Integer.parseInt(str[1])>9){
continue;
}
if(Integer.parseInt(str[1])==9){
if(Integer.parseInt(str[2])>6){
continue;
}
}
}
//年龄相差大于200
if(Integer.parseInt(str[0])<1814){
continue;
}
if(Integer.parseInt(str[0])==1814){
if(Integer.parseInt(str[1])<9){
continue;
}
if(Integer.parseInt(str[1])==9){
if(Integer.parseInt(str[2])<6){
continue;
}
}
}
map.put(sdf.parse(key),value);
cnt++;
}
if(map.size()==0){
System.out.println("0");return;
}
int num=0;
System.out.print(cnt+" ");
for(Map.Entry<Date,String> m:map.entrySet()){
Date key=m.getKey();
String value=m.getValue();
num++;
if(num==1){
System.out.print(value+" ");
}
if(num==cnt){
System.out.println(value);
}
}
}
}
判断年龄是否合法的代码其实可以很简化:
if(key.compareTo("2014/09/06")>0||key.compareTo("1814/09/06")<0){
continue;
}
一个测试点没过: