之所以叫採藥僧,是我覺得- -我每天都需要吃藥搶救自己的懶癌,僧,恩,程序員的歸宿。 想想都怕 !!!自己開始寫博客,確實覺得寫好博客,查看資料,還是挺難得,分享一下自己的東西,希望大家支持一下,也多看看大牛整合了下。即便是也有自己的理解,希望大家以後多多支持,相互關注,小白的成長之旅。也請大家多多監督。 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裏的月份從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