主頁 > 後端開發 > 你知道程式都是怎么處理時區問題的么?

你知道程式都是怎么處理時區問題的么?

2021-01-24 21:47:50 後端開發

有情懷,有干貨,微信搜索【三太子敖丙】關注這個不一樣的程式員,

本文 GitHub https://github.com/JavaFamily 已收錄,有一線大廠面試完整考點、資料以及我的系列文章,

前言

在實際業務開發中,會碰到夏令時,閏秒,時區轉換的問題,這些問題都需要從業務角度去考慮,保證用戶在任何地區看到的資料都一致的,這就需要MySQL資料庫、后端服務以及前端服務做相應的處理才能完成,

最近我也剛好在開發的時候遇到了,所幸就寫下這個比較冷門的文章,跟大家聊聊夏令時,閏秒,時區轉換在實際開發程序中的解決方案,

夏令時

夏令時介紹

夏令時(Daylight Saving Time:DST):又稱"日光節約時制",是一種為節約能源而人為規定地方時間的制度,在這一制度實行期間所采用的統一時間稱為“夏令時間”,

一般在天亮早的夏季人為將時間調快一小時,可以使人早起早睡,減少照明量,以充分利用光照資源,從而節約照明用電,除了夏令時外還有冬令時,采用的是本地的標準時間,

可以看到意大利是有夏令時制,夏令時的時間從3月28日到10月31日,冬令時(本地標準時間)是從11月1日到3月27日,在夏令時時段內,時間比標準時間快一個小時,例如羅馬市的時區GMT + 1:00,標準時間為10:00:00,在夏令時的時間就是11:00:00,冬令時的時間就是10:00:00,

CET (中歐標準時間) 是UTC + 01:00時區的名稱之一,比UTC(世界標準時間)提前1個小時,與UTC的時間偏差可寫為+01:00,在冬天使用,在夏季時使用CEST - 中歐夏令時間 (UTC + 02:00,提前一個小時),

LInux時區

Linux服務器的系統時間的校準是通過NTP(Network Time Protocol)服務來實作,每隔一段時間會跟時鐘源進行校對,確保Linux系統時間的準確性,同時Linux作業系統支持不同國家及地區的時區設定,所有時區資訊位于/usr/share/zoneinfo目錄下,如果需要設定時區,只需要將/etc/localtime軟鏈接到一個具體的地區即可,如果這個地區有DST機制,那么Linux會自動在DST和標準時間之間切換,不需要額外的代碼來處理,

## Linux支持的區域資訊
$ ls -ltr /usr/share/zoneinfo/
total 320
lrwxrwxrwx  1 root root     3 10月 23 05:18 Zulu -> UCT
-rw-r--r--  1 root root  1544 10月 23 05:18 W-SU
-rw-r--r--  1 root root  1873 10月 23 05:18 WET
lrwxrwxrwx  1 root root     3 10月 23 05:18 UTC -> UCT
lrwxrwxrwx  1 root root     3 10月 23 05:18 Universal -> UCT
-rw-r--r--  1 root root   127 10月 23 05:18 UCT
-rw-r--r--  1 root root  1970 10月 23 05:18 CET
## 前端服務所在Linux服務器的時區
$ ls -ltr /etc/localtime 
lrwxrwxrwx 1 root root 33 11月  1 06:20 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai

通過zdump命令查看下意大利羅馬的時區屬性,

$ zdump -v /usr/share/zoneinfo/CET
/usr/share/zoneinfo/CET  Sun Mar 28 00:59:59 2021 UT = Sun Mar 28 01:59:59 2021 CET isdst=0 gmtoff=3600
/usr/share/zoneinfo/CET  Sun Mar 28 01:00:00 2021 UT = Sun Mar 28 03:00:00 2021 CEST isdst=1 gmtoff=7200 #2021年夏令時開始
/usr/share/zoneinfo/CET  Sun Oct 31 00:59:59 2021 UT = Sun Oct 31 02:59:59 2021 CEST isdst=1 gmtoff=7200 #2021年夏令時結束

Sun Mar 28 01:00:00 2021 UT = Sun Mar 28 03:00:00 2021 CEST isdst=1 gmtoff=7200

從上面的資訊可以看到,2021年夏令時的開始時間是Sun Mar 28 01:00:00,結束時間為Sun Oct 31 00:59:59,isdst = 1說明當前處于DST時段,gmtoff=7200表示與格林治時間的offset,單位秒,即UTC + 02:00,也稱為CEST時間,這說明Linux作業系統已經自動實作了下夏令時DST的自動切換,

處理夏令時

舉個例子,意大利羅馬的客戶需要開發一個稅務系統,用于國內各地市的稅收記賬,由于意大利是有夏令時制,就需要考慮夏令時DST的處理,在開發的程序中,涉及時間問題的包括MySQL資料庫(mysql-server),后端服務(backend-service)以及前端服務(frontend-service)三個方面,下面就從三個層面分析如何去處理DST,

  1. 前端處理

業務對前端的要求是:不管使用的是移動端還是PC端,都應該正確的顯示當時時間,包括有夏令時制的時間,

如果在中國的話,就比較好處理,沒有DST機制,統一使用東八區即GMT/UTC + 08:00即可,前端服務的時間直接取Linux服務服務器的系統時間,Linux的時區只需要設定為Asia/Shanghai即可,前端不需要做任何時間的轉入轉出,

**轉入:**指POST請求寫入資料,user —> frontend-service —> backend-service —> mysql-server,例如繳稅介面,

**轉出:**指GET請求查詢資料,mysql-server —> backend-service —> frontend-service —> user,例如查詢介面,

不過開心的是,Linux作業系統已經自動實作了DST轉換,在前端不需要做任何處理,設定Linux時區為CET,

# 修改LInux時區為CET,也可以通過timedatectl命令修改,
$ ln -sf /usr/share/zoneinfo/CET /etc/localtime

這樣在意大利國內的用戶的通過終端(移動端或PC端),登錄系統繳稅或查詢時,用戶時間和前端服務的時間完全一致,即完成如下這一步的處理,

  1. 后端處理

我們了解了前端Linux服務器的時區設定為CET,就能自動處理意大利DST夏令時轉換了,后端Java程式部署在Linux服務器上,將其時區設定跟前端一樣,也是CET時區,后端只需要接收前端傳過來的值進行MySQL的CRUD操作即可,稅務表的結構如下:

CREATE TABLE `tax_form` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
  `tax_id` varchar(20) NOT NULL DEFAULT '' COMMENT '稅務編號',
  `amount` decimal(12,4) NOT NULL DEFAULT '0.0000' COMMENT '納稅金額',
  `tax_payer_id` varchar(20) NOT NULL DEFAULT '' COMMENT '納稅人編號',
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '繳稅狀態',
  `audit_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '審核時間',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='稅務記錄表';

主要看一下繳稅和審核介面,分別的對應的SQL陳述句如下:

繳稅

-- 繳稅介面的對應的SQL
insert into tax_form(tax_id,amount,tax_payer_id,status) values('T001', 1234.56, 'U001', 0)

審核

-- 修改審核狀態
update tax_form set status = 1, audit_time = '2021-01-07 12:02:30' where  tax_payer_id = 'U001';

涉及時間的欄位有兩類

**公共欄位:**create_time,update_time這些是每個表必須有的時間欄位,而且默認都是MySQL的CURRENT_TIMESTAMP,取的MySQL server的當前系統時間,而這個時間是跟MySQL的時區time_zone設定不同而變化的,同時MySQL也是支持夏令時DST自動轉換的,

業務欄位:audit_time審核時間屬性是由前端頁面傳到后端進行處理,后端無需做任何轉換,

  1. MySQL處理

MySQL也是支持夏令時DST機制,不過設定時區time_zone只能設定為地區(類似Linux設定時區一樣),不能石永紅MySQL設定的時區的相關變數

mysql> show variables like '%zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |   -- 資料庫服務器的當前時區,不可修改,CST這里指的是中國標準時間(China Standard Time UTC+08:00,即東八區)
| time_zone        | SYSTEM |   -- 資料庫時區,默認跟服務器保持一致,可修改,

目前是東八區,修改為意大利時區,即東一區,

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2021-01-07 13:43:31 
-- 修改資料庫時區為零時區,即,
mysql> set time_zone = 'CET';
ERROR 1298 (HY000): Unknown or incorrect time zone: 'CET'
-- 嘗試通過+0:00方式修改,可以成功修改,
mysql> set time_zone = '+1:00';
Query OK, 0 rows affected (0.00 sec)

MySQL存盤時區資訊的資料字典

mysql> show tables from mysql like '%time_zone%';
+-------------------------------+
| Tables_in_mysql (%time_zone%) |
+-------------------------------+
| time_zone                     |   -- 時區資訊
| time_zone_leap_second         |   -- 時區閏秒資訊
| time_zone_name                |   -- 時區名
| time_zone_transition          |   -- 時區轉換
| time_zone_transition_type     |   -- 時區轉換型別

默認情況下,這些表都是空的,需要通過MySQL專門提供的命令mysql_tzinfo_to_sql匯入,資料會被插入到表time_zone相關的表中,

# Linux下的時區資訊/usr/share/zoneinfo通過命令mysql_tzinfo_to_sql加載到相關的time_zone表中,
$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

執行完成之后,看一下表中的資料,再嘗試設定時區為CET,

mysql> select * from mysql.time_zone_name where name like '%CET%';
+------+--------------+
| Name | Time_zone_id |
+------+--------------+
| CET  |          373 |
-- 設定時區為CET
mysql> set time_zone = 'CET';
Query OK, 0 rows affected (0.02 sec)
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2021-01-07 10:00:36 |

而且也支持時區轉換,例如將北京時間轉換成羅馬時間,

-- 北京時間17:00:00轉換成CET的羅馬時間就是10:00:00
mysql> select convert_tz('2021-01-07 17:00:00', 'Asia/Shanghai', 'CET') as time;
+---------------------+
| time                |
+---------------------+
| 2021-01-07 10:00:00 |

我們要解決的問題是:MySQL設定time_zone='CET’后是否能自動實作DST轉換,如果可以的話,那么用戶端、前端服務、后端服務以及MySQL服務器時區就統一為CET,同時都能自動處理DST,從上面的zdump -v /usr/share/zoneinfo/CET命令輸出可以看到,2021年意大利的夏令時從3月28號01:59:59號開始,也就是時間調快一小時,

-- 01:59:59時間點,沒有發生DST切換,
mysql> select convert_tz('2021-03-28 01:59:59', '+1:00', 'CET') as time;
+---------------------+
| time                |
+---------------------+
| 2021-03-28 01:59:59 | 
-- 02:00:00時間點,確實發生DST切換,從02:00:00調快了一小時變成了03:00:00
mysql> select convert_tz('2021-03-28 02:00:00', '+1:00', 'CET') as time;
+---------------------+
| time                |
+---------------------+
| 2021-03-28 03:00:00 |
-- 將+1:00時間換成CET,結果也是一樣的,發生了DST切換,
mysql> select convert_tz('2021-03-28 02:00:00', 'CET', 'CET') as time;
+---------------------+
| time                |
+---------------------+
| 2021-03-28 03:00:00 |

從上面的結果可以看到,當time_zone設定成地區/城市,系統會自動解決夏令時DSTQ切換問題,如果設定time_zone=’+1:00’這種方式就失去了夏令時機制,目前在MySQL資料庫中,在初始化time_zone相關表元資料以后,MySQL就可以自己完成夏令時的修正,不需要額外的服務處理,

對于AWS RDS的來說,time_zone是可以選擇地區/城市的,也就是支持夏令時的自動切換,

  1. 處理夏令時總結

通過上面的分析可以知道,Linux服務器和MySQL服務器都可以自動處理DST切換,前提是需要設定Linux的時區和MySQL時區為地區,例如都設定為CET,

閏秒

指為保持協調世界時接近于世界時時刻,由國際計量局統一規定在年底或年中(也可能在季末)對協調世界時增加或減少1秒的調整,最近一次閏秒在北京時間2017年1月1日7時59分59秒(時鐘顯示07:59:60)出現,

在實際的業務系統,受閏秒影響的有Linux服務器,Java代碼以及MySQL資料庫,我們來看看它們分別是怎么解決的LeapSecond問題的,

Linux服務器

對于大多數新的linux內核(2.6.x內核以后是支持LeapSecond,在這之前可能會導致Linux Kernel Crash),在設計時都是支持閏秒的,Linux作業系統時間是通過NTP服務來和時鐘源來進行同步,NTP會一級一級地下發閏秒事件通知直到最邊緣的NTP服務器,然后NTP就會把閏秒通知給客戶端的作業系統,由作業系統來處理閏秒通知,

對于閏秒2017-01-01 07:59:60,Linux內核需要處理這個時間,就需要做一些特定的處理,一般會有以下三種方案,

  1. 后退一秒
  2. 停止一秒
  3. 真正的增加一秒

第一種方式會導致一些基于timestamp的訊息通知亂序了,而第二種會導致出現兩個一模一樣的timestamp,而最后一種不會出現timestamp的問題,也是后面Linux內核選擇的處理方案,

mysql> select UNIX_TIMESTAMP('2017-01-01 07:59:59') as nts;
+------------+
| nts        |
+------------+
| 1483257599 |
$ date -d '@1483257599' --utc
Sun Jan  1 07:59:59 UTC 2017
$ date -d '@1483257600' --utc
Sun Jan  1 08:00:00 UTC 2017

從這里可以看到,Linux采用的是第三種方案:真正的增加一秒,這也符合業務系統的需求,

Java代碼

Java代碼的System.currentTimeMillis()會產生閏秒60,是取決于Linux作業系統的,在Linux Kernel 2.6.x之后已經fix了LeapSecond問題,

MySQL資料庫

上面看到了在MySQL下已經有了mysql.time_zone_leap_second資料字典,說明已經支持了LeapSecond,處理方案跟Linux類似,

-- 創建一張測驗表存盤timestamp時間戳
CREATE TABLE ls(  
id bigint NOT NULL COMMENT 'id',
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id));
-- 設定資料庫時區為UTC
mysql> set time_zone = 'UTC';
mysql> set timestamp = 1483257599;  --對應時間:2017-01-01 07:59:59
mysql> insert into ls(id) values(1);
mysql> set timestamp = 1483257600;  --對應時間:2017-01-01 07:59:60
mysql> insert into ls(id) values(2);
-- 可以看到MySQL對閏秒進行了處理,將07:59:60轉換成了08:00:00,
mysql> select id, ts, unix_timestamp(ts) from ls;
+----+---------------------+--------------------+
| id | ts                  | unix_timestamp(ts) |
+----+---------------------+--------------------+
|  1 | 2017-01-01 07:59:59 |         1483257599 |
|  2 | 2017-01-01 08:00:00 |         1483257600 |
-- 通過閏秒時間查詢會報錯
mysql> select * from ls where ts = '2017-01-01 07:59:60';
ERROR 1525 (HY000): Incorrect TIMESTAMP value: '2017-01-01 07:59:60'
mysql> select * from ls where ts = '2017-01-01 08:00:00';
+----+---------------------+
| id | ts                  |
+----+---------------------+
|  2 | 2017-01-01 08:00:00 |

跨境系統的時間處理

上面介紹的意大利羅馬的稅務系統,其實屬于政企業務,只服務于國內的用戶的需求,不涉及海外用戶的請求,相對來說地區和人員都比較固定,但是像這種跨境電商巨頭ebay,它服務的用戶遍布全球各地,而且每個地區的時區不同,同時每個時區的夏令時DST的起始時間也不一樣,我們要解決的是要根據客戶所在地區顯示正確的時間(包括DST),跟前面的DST處理一樣也涉及到三端處理:前端服務(frontend-service),后端服務(backend-service)以及MySQL資料庫(mysql-server),

從這個圖上可以看到,前端服務的UI層跟用戶所在的地區時間要完全一致,至于后端服務和MySQL如何處理時間,對于用戶來說根本不關心的,這就要求前端必須要根據不同地區,不同時區,不同夏令時DST產生不同的時間的用戶進行轉換處理,不同地區的時間轉換目前前端(Vue/React)已經有現成的插件可直接使用,

同時希望只在前端處理用戶時間的轉入和轉出,后端和MySQL資料庫不做任何修改就能完成業務處理和資料存盤,

北京用戶在UTC + 8也就是東八區,而羅馬用戶在UTC + 1東一區,都是在UTC的基礎上做處理,那我們就可以將時區都設定為UTC,然后根據用戶所在地區進行相應的處理,

MySQL處理

設定MySQL資料庫的時區為UTC,不管用戶來自哪個地區存盤在資料庫的時間都是UTC,包括公共時間欄位(創建時間,修改時間)以及業務時間欄位(交易開始時間,交易結束時間),

-- 設定資料庫時區為UTC,即零時區
set global time_zone = 'UTC'

后端處理

MySQL時區是UTC,那么后端服務的所在的Linux Server時區統一設定為UTC,跟MySQL保持一致,這樣后端就不需要做任何轉換,

前端處理

前端拿到標準時區UTC的資料,統一根據用戶所在時區進行轉換,這樣保證與后端資料時區的一致性,前端根據實際情況進行渲染,一般來講,前端將時間資料傳遞到后端,后端封裝成timestamp后存盤在MySQL中對應timestamp型別(MySQL中的timestamp是不區分時區的,例如資料庫是UTC 02:00:00,北京用戶使用ebay在CST 10:00:00下單,資料庫中的訂單表的create_time就應該存盤2020-12-03 10:00:00),同時前端查詢資料的也要做相應的轉換處理,

定時任務

后端服務一般都會一些定時任務,這個時間一般取自Linux OS的時間,跟前端沒關系,基于Linux的UTC時區做相應的調整即可,

總結

上面介紹了夏令時,閏秒以及跨境系統的時間處理問題,主要涉及到MySQL資料庫,后端服務以及前端服務三個層面,對于夏令時,閏秒的轉換處理,Linux和MySQL都可以自動完成處理,不需要額外轉換;對于跨境系統的時間處理,通過設定Linux和MySQL時區為UTC,只需要前端服務處理不同地區用戶時間問題,降低了系統改造的風險,今天就聊這么多,希望對大家有所幫助,

絮叨

敖丙把自己的面試文章整理成了一本電子書,共 1630頁!

干貨滿滿,字字精髓,目錄如下,還有我復習時總結的面試題以及簡歷模板,現在免費送給大家,

鏈接:https://pan.baidu.com/s/1ZQEKJBgtYle3v-1LimcSwg 密碼:wjk6

我是敖丙,你知道的越多,你不知道的越多,感謝各位人才的:點贊收藏評論,我們下期見!


文章持續更新,可以微信搜一搜「 三太子敖丙 」第一時間閱讀,回復【資料】有我準備的一線大廠面試資料和簡歷模板,本文 GitHub https://github.com/JavaFamily 已經收錄,有大廠面試完整考點,歡迎Star,

敖 丙 CSDN認證博客專家 CSDN簽約作者 演算法工程師 B站網紅UP
微信搜一搜【敖丙】關注這個文縐縐的程式員,關注后回復【資料】有我準備的一線大廠面試資料和簡歷模板,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/251755.html

標籤:java

上一篇:你想被開除嗎?來看看程式員【離職小技巧】吧

下一篇:為普及再助一把力!《2021年中國低代碼/無代碼市場研究報告》正式發布

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more