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">    
    <label class="col-md-3 control-label" for="end">日期</label>
        <div class="col-md-6">
            <input type="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"%>
<fmt:formatDate value="${數據}" 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裏的月份從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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章