Date经验、SimpleDateFormat用法和java 8 DateLocal学习

之所以叫采药僧,是我觉得- -我每天都需要吃药抢救自己的懒癌,僧,恩,程序员的归宿。 想想都怕 !!!自己开始写博客,确实觉得写好博客,查看资料,还是挺难得,分享一下自己的东西,希望大家支持一下,也多看看大牛整合了下。即便是也有自己的理解,希望大家以后多多支持,相互关注,小白的成长之旅。也请大家多多监督。 https://blog.csdn.net/qq_29364429


Date和DateLocal

俩个类都是面向对象的编程,并非单纯的初始化,而是封装了大量的方法,符合开放封闭原则,比如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);
        }
}

运行结果:
Date经验、SimpleDateFormat用法和java 8 DateLocal学习_第1张图片

数据库会有即时数据更新,比如记录插入数据的具体时间,这个问题最近发现sql自带了时间戳,不需要写后台-0-!!!!设置类型为timestamp,然后默认值设置:CURRENT_TIMESTAMP

Date经验、SimpleDateFormat用法和java 8 DateLocal学习_第2张图片

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();

    }
}

运行结果:
Date经验、SimpleDateFormat用法和java 8 DateLocal学习_第3张图片

下面是在网上看到的生日计算提示表,想想以后也许会用到就记录一下,以后写网站,用户生日到了或者有个提示还是有用的。

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里的月份从011:
        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

你可能感兴趣的:(java)