Mysql中經(jīng)常用來(lái)存儲(chǔ)日期的數(shù)據(jù)類型有三種:Date、Datetime、Timestamp。
創(chuàng)新互聯(lián)公司專注骨干網(wǎng)絡(luò)服務(wù)器租用十余年,服務(wù)更有保障!服務(wù)器租用,BGP機(jī)房服務(wù)器托管 成都服務(wù)器租用,成都服務(wù)器托管,骨干網(wǎng)絡(luò)帶寬,享受低延遲,高速訪問(wèn)。靈活、實(shí)現(xiàn)低成本的共享或公網(wǎng)數(shù)據(jù)中心高速帶寬的專屬高性能服務(wù)器。
Date數(shù)據(jù)類型:用來(lái)存儲(chǔ)沒(méi)有時(shí)間的日期。Mysql獲取和顯示這個(gè)類型的格式為“YYYY-MM-DD”。支持的時(shí)間范圍為“1000-00-00”到“9999-12-31”。
Datetime類型:存儲(chǔ)既有日期又有時(shí)間的數(shù)據(jù)。存儲(chǔ)和顯示的格式為 “YYYY-MM-DD HH:MM:SS”。支持的時(shí)間范圍是“1000-00-00 00:00:00”到“9999-12-31 23:59:59”。
Timestamp類型:也是存儲(chǔ)既有日期又有時(shí)間的數(shù)據(jù)。存儲(chǔ)和顯示的格式跟Datetime一樣。支持的時(shí)間范圍是“1970-01-01 00:00:01”到“2038-01-19 03:14:07”。
所有不符合上面所述格式的數(shù)據(jù)都會(huì)被轉(zhuǎn)換為相應(yīng)類型的0值。(0000-00-00或者0000-00-00 00:00:00)
把php.ini中的
;date.timezone =
修改成 date.timezone = PRC
重啟即可
還有
我們一般使用“date -s”命令來(lái)修改系統(tǒng)時(shí)間。比如將系統(tǒng)時(shí)間設(shè)定成2005年7月26日的命令如下。
#date -s 03/28/2008
將系統(tǒng)時(shí)間設(shè)定成下午11點(diǎn)12分0秒的命令如下。
#date -s 11:24:00
注意,這里說(shuō)的是系統(tǒng)時(shí)間,是linux由操作系統(tǒng)維護(hù)的。
在系統(tǒng)啟動(dòng)時(shí),Linux操作系統(tǒng)將時(shí)間從CMOS中讀到系統(tǒng)時(shí)間變量中,以后修改時(shí)間通過(guò)修改系統(tǒng)時(shí)間實(shí)現(xiàn)。為了保持系統(tǒng)時(shí)間與CMOS時(shí)間的一致性,Linux每隔一段時(shí)間會(huì)將系統(tǒng)時(shí)間寫入CMOS。由于該同步是每隔一段時(shí)間(大約是11分鐘)進(jìn)行的,在我們執(zhí)行date -s后,如果馬上重起機(jī)器,修改時(shí)間就有可能沒(méi)有被寫入CMOS,這就是問(wèn)題的原因。如果要確保修改生效可以執(zhí)行如下命令。
#clock -w
這個(gè)命令強(qiáng)制把系統(tǒng)時(shí)間寫入CMOS。
將Excel文件中的數(shù)據(jù)保存到mysql中時(shí),發(fā)現(xiàn)日期變成了數(shù)字。
當(dāng)excel中的日期以數(shù)字顯示就會(huì)變成類似44721.81這樣的數(shù)字,這是從1900年開始的天數(shù)。
而UNIX時(shí)間戳的 0 按照 ISO 8601 規(guī)范為 :1970-01-01T00:00:00Z.。也就是從1970開始。
那當(dāng)我們需要在其他地方處理excel這種時(shí)間時(shí)就只需要加上70年就行了。接下來(lái)的問(wèn)題就是如何知道這70年的秒數(shù)或毫秒數(shù),可以在excel輸入1970/1/1然后轉(zhuǎn)換成數(shù)字得到25569,這是天數(shù),秒則為25569*24*60*60=2209161600。毫秒的話再乘1000。精度取到秒和毫秒按實(shí)際情況定。
在excel中有個(gè)日期2022/6/9 19:31:57.850,當(dāng)其為數(shù)字格式時(shí)為44721.813864,就叫他Excel時(shí)間。
如果需要在java中將其轉(zhuǎn)化為日期,Date date = new Date(new Long(時(shí)間戳);這里需要毫秒精度的時(shí)間戳。先將Excel時(shí)間*一天的毫秒數(shù)(24*60*60*1000)-70年(2209161600*1000)-8小時(shí)時(shí)差(8*60*60*1000)=1654774317850。代入上方得到2022/6/9 19:31:57.850,轉(zhuǎn)換正確。
如果需要在mysql中將其轉(zhuǎn)化為日期,F(xiàn)ROM_UNIXTIME(時(shí)間戳,'%Y-%m-%d %H:%i:%S');這里只需要秒精度的時(shí)間戳。先將Excel時(shí)間*一天的秒數(shù)(24*60*60)-70年(2209161600)-8小時(shí)時(shí)差(8*60*60)=1654774317。代入上方得到2022/6/9 19:31:57,轉(zhuǎn)換正確。
當(dāng)excel中的日期到mysql中變成數(shù)字了,只需要FROM_UNIXTIME(Excel時(shí)間*86400-2209190400,'%Y-%m-%d %H:%i:%s')就可以轉(zhuǎn)化成正常時(shí)間了
設(shè)置某字段為當(dāng)前時(shí)間,修改日期類型為timestamp并允許空,如下:
create
table
`test`
(`aaaa`
varchar(50)
not
null,`createday`
timestamp
null
default
current_timestamp
on
update
current_timestamp)
engine=innodb
default
charset=utf8;
如果是在navicat下操作的話,設(shè)置字段的類型為timestamp,默認(rèn)值寫上
current_timestamp.
由于MySQL目前字段的默認(rèn)值不支持函數(shù),所以以create_time datetime default now() 的形式設(shè)置默認(rèn)值是不可能的。代替的方案是使用TIMESTAMP類型代替DATETIME類型。
TIMESTAMP列類型自動(dòng)地用當(dāng)前的日期和時(shí)間標(biāo)記INSERT或UPDATE的操作。如果有多個(gè)TIMESTAMP列,只有第一個(gè)自動(dòng)更新。