

JSON UTC 時間轉 yyyy-MM-mm HH:mm:ss 格式本地時間之香草 JavaScript 極簡解法
source link: https://blog.darkthread.net/blog/js-date-yyyymmdd-hhmmss/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

JSON UTC 時間轉 yyyy-MM-mm HH:mm:ss 格式本地時間之香草 JavaScript 極簡解法-黑暗執行緒
生活與工作上遇過多次,從後端接到 2023-07-25T23:30:00Z JSON 格式的 UTC 時間字串,new Date('2023-07-25T23:30:00Z') 轉成 Date 物件後,不想為此引用程式庫,如何用原生 API 再轉成本地時間的 yyyy-MM-mm HH:mm:ss 格式 2023-07-26 07:30:00
?
.toISOString() 可得到格式很接近的答案,但它一律使用 UTC 時區沒得修改,必須自己換算再去掉 T 及結尾的 Z;另一個是問 ChatGPT 常會得到的答案,乖乖用 getFullYear()、.getMonth()(記得要加 1)... 取值再前方補零至兩位,直覺好懂,但太囉嗦了,不合我的胃口。
var d = new Date('2023-07-25T23:30:00Z');
console.log(d.toString());
console.log(d.toISOString());
// 方法一 由 ChatGPT
function f1(d) {
let year = d.getFullYear();
let month = ("0" + (d.getMonth() + 1)).slice(-2); // Month is zero-based
let day = ("0" + d.getDate()).slice(-2);
let hour = ("0" + d.getHours()).slice(-2);
let minute = ("0" + d.getMinutes()).slice(-2);
let second = ("0" + d.getSeconds()).slice(-2);
return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
}
// 方法一 換算時區後 toISOString() 再去掉 T 及結尾 Z
function f2(d) {
d = new Date(d.getTime() - d.getTimezoneOffset()*60*1000);
return d.toISOString().replace('T',' ').substr(0, 19);
}
console.log(f1(d));
console.log(f2(d));
今天意外找到一個超精簡的巧妙解法,toLocaleString('sv'),這樣就好了!
var d = new Date('2023-07-25T23:30:00Z');
console.log(d.toLocaleString('sv'));
.toLocaleString() API支援 地區設定參數(Locale,如台灣是 zh-TW、美國是 en-US),而 sv 是瑞典(Swedish)的地區代碼,巧的是瑞典慣用的日期格式是 yyyy-MM-dd,時間格式是 HH:mm:ss (24 小時制),就醬,不費吹灰之力就得到我們要的 yyyy-MM-dd HH:mm:ss。
好奇還有哪些國家地區也是用 yyyy-MM-dd HH:mm:ss?我在 Github 找到一份完整地區名稱清單,但不是所有 Locale JavaScript 都支援,要先用 Intl.DateTimeFormat.supportedLocalesOf() 篩選,我寫了一小段程式,掃過一輪,找到共有 11 個地區是用 yyyy-MM-dd HH:mm:ss:
<!DOCTYPE html>
<html>
<head>
<title>demo</title>
<meta charset="utf-8">
</head>
<body>
<!-- data source: https://github.com/umpirsky/locale-list/blob/master/data/en/locales.json -->
<script src="locales.js"></script>
<script>
//replace _ to - for locale name
const data = {};
Object.keys(localeData).forEach(l =>
data[l.replace(/_/g, '-')] = localeData[l]
);
const date = new Date('2023-08-08T10:00:00Z');
const noSupportList = [];
const locales =
Object.keys(data)
.filter(l => {
let valid = Intl.DateTimeFormat.supportedLocalesOf(l).length > 0;
if (!valid) noSupportList.push(l);
return valid;
});
locales.sort();
locales.forEach(function (locale) {
locale = locale.replace('_', '-');
const str = date.toLocaleString(locale);
if (str == '2023-08-08 18:00:00') {
console.log(`${str} ${locale}, ${data[locale]}`);
}
});
console.log('unsupported locales: ' + noSupportList.join(', '));
</script>
</body>
</html>
若求簡短,除了 sv (瑞典),af (阿富汗)、ky (吉爾吉斯)、lt (立陶宛) 也是好選擇。
同場加映,如果是 yyyy/MM/dd HH:mm:ss 呢?答案是沒有現成地區符合,需要加點工,toLocaleString() 時指定年月日時分秒補零到兩位,hour12 = false 切 24 小時制,如此有 9 個地區代碼吻合,求簡短可以用 jp、zh,或是直接用 zh-TW 最好記:
locales.forEach(function (locale) {
locale = locale.replace('_', '-');
const str = date.toLocaleString(locale, {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: false
});
if (str == '2023/08/08 18:00:00') {
console.log(`${str} ${locale}, ${data[locale]}`);
}
});
- Posted in
- JavaScript
and has 1 comment
Comments
Post a comment
CommentRecommend
-
71
Häagen·Dazs 哈根达斯 香草味冰淇淋 430g + 赠 G7 杰拉多 提拉米苏冰淇淋 80g 39.9元,来自什么值得买甄选出的中粮我买网优惠产品,汇聚数十万什么值得买网友对该网购产品的点评。
-
49
马迭尔 香草/朗姆/榴莲/芒果/抹茶/香草 冰淇淋 85g *15件 99元包邮(99选15件),来自什么值得买甄选出的京东优惠产品,汇聚数十万什么值得买网友对该网购产品的点评。
-
17
(悬赏100金币)银河香草的交易结构。 一直不理解香草是如何在确保牛市不输于500的情况下,完全保证风险的,既然机构可以这样做(...
-
21
银河香草产品常见问题解答(和银河证券工作人员的沟通结果) 银河香草
-
11
Minimal API-黑暗執行緒 先前展示過用 50 行 Program.cs 寫個 ASP.NET Core CORS 上傳服務,從讀者 Joker 留言我學到新名詞 - Minimal API,身為極簡主義者,它絕對是我的...
-
6
打造極簡式 ASP.NET Core 桌面小工具 對於網頁開發者來說,開發桌面小工具寫成網頁再轉桌面應用程式是最省時省力的選擇,而 Github 開發的 Electron 則是最流行的網頁轉桌面應用程式框架,大家日...
-
12
打造極簡式 ASP.NET Core 桌面小工具 陸續介紹在 ASP.NET Core 專案內嵌 HTML、.js 跑介面、呼叫 Minimal API MapPost("...") 寫的 WebAPI,
-
10
嵌入 .html/.css/.js 靜態檔案徹底實現單檔部署-黑暗執行緒 ASP.NET Core 極簡風 - Minimal API 提到只需加一行 UseFileServer(),ASP.NET Core 空白網站就可以像 ASP.NET MVC 一樣,將 .h...
-
10
由一個極簡單的計劃開始 曾經收到一位網友pm,講述他一個投資想法。若你未有一個投資計劃,仍處於「投資只為賺點外快」的階段,甚至還未開始投資,值得了解一下。
-
8
用 JavaScript 執行 AES 加解密 最近突發奇想,想將系統查詢結果嵌入網頁匯出成 .html,概念上像 Excel 或 Word 一樣是個文件檔,方便 Email 轉寄、歸檔保存,而採用網頁的好處是免裝軟體,用瀏覽器就能開啟,透過 JavaScript 可實現極佳的互...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK