一 YYYY-MM-dd与yyyy-MM-dd 的区别
YYYY是week-based-year,表示当天所在的周属于的年份,一同从周日开始,周六结束,只要本周跨年那么这周就算入下一个年份中。所以2019年12月31日那天在这种转换方式下就是2020年。而当yyyy这种情况下年份就是2019。
public static void main(String[] args) {
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat simpleDateFormat1=new SimpleDateFormat("YYYY-MM-dd");
Calendar calendar=Calendar.getInstance();
calendar.set(2019, 11, 31);
System.out.println("yyyy-MM-dd格式转换:"+simpleDateFormat.format(calendar.getTime()));
System.out.println("YYYY-MM-dd格式转换:"+simpleDateFormat1.format(calendar.getTime()));
}
控制台输入如下:
二 HH:mm:ss与hh:mm:ss的区别
HH表示24小时制,从0开始到23,而hh则是12小时制,从1开始到12.
public static void main(String[] args) {
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat simpleDateFormat1=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Calendar calendar=Calendar.getInstance();
calendar.set(2019, 11, 31,14,20,20);
System.out.println("yyyy-MM-dd HH:mm:ss格式转换:"+simpleDateFormat.format(calendar.getTime()));
System.out.println("yyyy-MM-dd hh:mm:ss格式转换:"+simpleDateFormat1.format(calendar.getTime()));
}
控制台输出如下:
三 当你用时间戳计算来获得当前时间几天前的时间出现的问题
public static void main(String[] args) {
String date = getDate(30);
}
public static String getDate(int days){
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//获取当前时间对应的时间戳
long nowTime=System.currentTimeMillis();
System.out.println("当前时间:"+simpleDateFormat.format(nowTime));
System.out.println("int类型最大值:"+Integer.MAX_VALUE);
System.out.println("int类型最小值:"+Integer.MIN_VALUE);
//获取要减去days的时间戳
long test= days*24*60*60*1000;
System.out.println((long)days*24*60*60*1000);
System.out.println("要被减去days的时间戳:"+test);
//获取days天前时间对应的时间戳
long yesTime=nowTime-test;
String yesTimeStr = simpleDateFormat.format(yesTime);
System.out.println("days天前的时间"+yesTimeStr);
return yesTimeStr;
}
控制台打印:
从上面打印可以看到,当你计算days天对应的时间戳时,结果的值如果超出了int类型的最大值时,会出现溢出得到负数的结果,这使得后面计算结果出现问题.至于为什么溢出后得到是这样的结果.大家有兴趣可以看看这篇博客:https://www.cnblogs.com/hesiyi/p/6963435.html
说回上面的问题,有2种方法解决,一种是使用强制转换(long)days* 24* 60* 60* 1000,另一种是在接受days时就用long类型接受就行.
但其实在遇到这种获取days天前的当前时间用Calendar计算比较好点,不会出现上面的问题.
public static void main(String[] args) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar calendar=Calendar.getInstance();
System.out.println("当前时间:"+format.format(calendar.getTime()));
calendar.add(Calendar.DATE,-30);
Date today = calendar.getTime();
System.out.println("30天前的:"+format.format(today));
}
控制台打印:
作为初学者最近在使用日期进行转换时出现以上问题,所以打算整理下来,希望对大家有帮助,有什么不对的地方大家可以在评论区指出来,大家一起学习进步!