之所以叫采药僧,是我觉得- -我每天都需要吃药抢救自己的懒癌,僧,恩,程序员的归宿。 想想都怕 !!!自己开始写博客,确实觉得写好博客,查看资料,还是挺难得,分享一下自己的东西,希望大家支持一下,也多看看大牛整合了下。即便是也有自己的理解,希望大家以后多多支持,相互关注,小白的成长之旅。也请大家多多监督。 https://blog.csdn.net/qq_29364429
俩个类都是面向对象的编程,并非单纯的初始化,而是封装了大量的方法,符合开放封闭原则,比如Date时间的计算并非是单纯的设置,而是以一个时间点进行计算,即大家熟知的格林威治时间GMT:1970-01-01 00:00:00 ,date即为熟知的时间点类。
Java8加入了新的处理年月日的类,LocalDate,稍微学习下。
因为长时间写web程序,所以有一点小的date经验在这里提一下。
个人发现:LocalDate相比于date方便在web方面更好的处理日月日时间要好的多。以后尝试使用。相比Date来说,LoalDate更安全、更精确也更明确。继续精确也可以用LocalDateTime了。
之前项目的Date类型因为前端对应了HTML5 的Date,但是对于Java的date对象无法识别,针对这一点前端其实是若语言类型,只需要在后台将date.toString 即可。
<div class="form-group">
<div class="col-md-6">
"date" name="" id="" class="form-control" value="${}">
div>
div>
另外的问题就是常规的Date显示问题,一种使用框架可以使用c标签或者s标签。下面c标签举例:
//jsp页面添加引用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
"${数据}" pattern="yyyy-MM-dd HH:mm:ss"/>
另一种在后台处理,方便处理。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); model.addAttribute("date",sdf.format(date));
但是上文的使用根据实验室小刚测试,后端使用时间戳消耗资源很大,所以在网上找了新的解决方案,使用js前端用户处理。(谁让我们不会写高并发呢- -)
<script>
function timetrans(date){
var date = new Date(date);//如果date为13位不需要乘1000
var Y = date.getFullYear() + '-';
var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
var D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + ' ';
var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
var m = (date.getMinutes() <10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
var s = (date.getSeconds() <10 ? '0' + date.getSeconds() : date.getSeconds());
return Y+M+D+h+m+s;
}
</script>
稍微补充一下日期格式化一些用法:
(熟悉下markdown制表格语法)
参数 | 含义 |
---|---|
yyyy | 年 |
MM | 月 |
dd | 日 |
hh | 1~12小时制(1-12) |
HH | 24小时制(0-23) |
mm | 分 |
ss | 秒 |
S | 毫秒 |
E | 星期几 |
D | 一年中的第几天 |
F | 一月中的第几个星期(会把这个月总共过的天数除以7) |
w | 一年中的第几个星期 |
W | 一月中的第几星期(会根据实际情况来算) |
a | 上下午标识 |
k | 和HH差不多,表示一天24小时制(1-24)。 |
K | 和hh差不多,表示一天12小时制(0-11)。 |
z | 表示时区 |
参考了下一个大佬代码,开始我以为日期格式只是单纯的为了获取YYYY-MM-DD,然而实际不是的。本质还是字符串,想怎么引用上面的变量就怎么引用。
import java.text.SimpleDateFormat;
import java.util.Date;
public class A3 {
public static void main(String[] args) {
Date ss = new Date();
System.out.println("一般日期输出:" + ss);
System.out.println("时间戳:" + ss.getTime());
//Date aw = Calendar.getInstance().getTime();//获得时间的另一种方式,测试效果一样
SimpleDateFormat format0 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = format0.format(ss.getTime());//这个就是把时间戳经过处理得到期望格式的时间
System.out.println("格式化结果0:" + time);
SimpleDateFormat format1 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
time = format1.format(ss.getTime());
System.out.println("格式化结果1:" + time);
}
}
数据库会有即时数据更新,比如记录插入数据的具体时间,这个问题最近发现sql自带了时间戳,不需要写后台-0-!!!!设置类型为timestamp,然后默认值设置:CURRENT_TIMESTAMP
LocalDate优点根据年月日取日期,月份从1开始到12 而不是java.util.date里的月份从0到11。
当前月的日历小程序(来自核心技术)。
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.Date;
public class A1 {
public static void main(String[] args) {
//java自带类:Date表示时间点,LocalDate日历表示法
//日历表示法只是单纯的年月日
String s = new Date().toString();
System.out.println(s);
//取当前日期,默认格式YYYY-MM-DD
LocalDate date=LocalDate.now();
//获取当前月份和今天的日期,用于后文判断
int month=date.getMonthValue();
int today=date.getDayOfMonth();
//回退到月首第一天,比如15号,就要回退14天
date=date.minusDays(today-1);
//获取月初的当天是星期几,比如星期天输出:SUNDAY
DayOfWeek weekday=date.getDayOfWeek();
//周内时间,测试星期一到星期日,是1-7
int value=weekday.getValue();
//月初没有的时间空格空出
System.out.println("Mon Tue Wed Thu Fri Sat Sun");
for(int i=1;i<value;i++) System.out.print(" ");
while(date.getMonthValue()==month){
//printf格式化输出
System.out.printf("%3d",date.getDayOfMonth());
if(date.getDayOfMonth()==today)
System.out.print("*");
else System.out.print(" ");
date=date.plusDays(1);
//星期一就换行
if(date.getDayOfWeek().getValue()==1)System.out.println();
}
//日历美观,最后一行判断换行
if(date.getDayOfWeek().getValue()!=1) System.out.println();
}
}
下面是在网上看到的生日计算提示表,想想以后也许会用到就记录一下,以后写网站,用户生日到了或者有个提示还是有用的。
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class A2 {
public static void main(String[] args) {
// 取当前日期:
LocalDate today = LocalDate.now();
System.out.println(today);
// 根据年月日取日期,月份从1开始到12,而不是java.util.date里的月份从0到11:
LocalDate birthday = LocalDate.of(2018, 2, 27);
long days = ChronoUnit.DAYS.between(birthday,today);
if(birthday.isBefore(today)){
System.out.println("生日已过"+days+"天");
}else{
System.out.println("还差"+Math.abs(days)+"天过生日");
}
}
}
最后稍微看了下localdate源码,人家写的好优雅,感叹下
然后发现:serialVersionUID 稍微查阅资料补充下知识。
private static final long serialVersionUID = 2942565459149668126L;
serialVersionUID适用于Java的序列化机制。简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException。
具体的序列化过程是这样的:序列化操作的时候系统会把当前类的serialVersionUID写入到序列化文件中,当反序列化时系统会去检测文件中的serialVersionUID,判断它是否与当前类的serialVersionUID一致,如果一致就说明序列化类的版本与当前类版本是一样的,可以反序列化成功,否则失败。
部分参考
- [1]: https://blog.csdn.net/qq_27093465/article/details/53034427
- [2]:https://zhidao.baidu.com/question/1176996811175803379.html