如何将ISO 8601字符串转换为本地日期时间及指定多语言日期格式
嘿,这个需求太常见了!不管是前端还是后端开发,处理ISO 8601时间格式转本地时间、自定义格式都是高频操作。我给你整理了JavaScript和Python两种主流语言的解决方案,直接抄作业就行👇
一、ISO 8601字符串转本地日期时间
首先要明确:ISO 8601里的Z代表UTC时区,所以转换时需要先解析UTC时间,再转成本地时区的时间。
JavaScript方案
直接用原生Date对象就能搞定,它会自动处理时区转换:
const isoTimeStr = '2018-03-08T08:30:00.000Z'; // 解析ISO字符串为Date对象,自动转换为本地时区 const localDateTime = new Date(isoTimeStr); // 如果你需要本地格式的字符串,用toLocaleString() console.log(localDateTime.toLocaleString()); // 比如在北京时间会输出:"2018/3/8 16:30:00"(因为UTC+8)
Python方案
需要借助datetime模块,注意要先把Z替换为+00:00才能被fromisoformat识别:
from datetime import datetime iso_time_str = '2018-03-08T08:30:00.000Z' # 处理Z为UTC时区标识,解析为UTC时间 utc_datetime = datetime.fromisoformat(iso_time_str.replace('Z', '+00:00')) # 转换为本地时区时间 local_datetime = utc_datetime.astimezone() print(local_datetime) # 比如在北京时间会输出:"2018-03-08 16:30:00+08:00"
二、转指定格式(英语'March 8 2018' & 德语'8. März 2018')
这里推荐用语言原生的国际化API,比手动拼接字符串靠谱多了,还能自动处理语言特有的格式和月份名称。
JavaScript方案
用Intl.DateTimeFormat,支持多语言,无需额外依赖:
const isoTimeStr = '2018-03-08T08:30:00.000Z'; const date = new Date(isoTimeStr); // 转英语格式:'March 8 2018' const enFormatted = new Intl.DateTimeFormat('en-US', { month: 'long', // 完整月份名 day: 'numeric', // 数字日期 year: 'numeric' // 数字年份 }).format(date); console.log(enFormatted); // 输出:"March 8 2018" // 转德语格式:'8. März 2018' const deFormatted = new Intl.DateTimeFormat('de-DE', { day: 'numeric', month: 'long', year: 'numeric' }).format(date); console.log(deFormatted); // 输出:"8. März 2018"
Python方案
需要用到strftime和locale设置,注意系统要支持对应的语言包:
from datetime import datetime import locale iso_time_str = '2018-03-08T08:30:00.000Z' utc_datetime = datetime.fromisoformat(iso_time_str.replace('Z', '+00:00')) local_datetime = utc_datetime.astimezone() # 转英语格式:'March 8 2018' # %B是完整月份名,%d是日期,%Y是四位数年份,replace去掉日期前的0 en_formatted = local_datetime.strftime('%B %d %Y').replace(' 0', ' ') print(en_formatted) # 输出:"March 8 2018" # 转德语格式:'8. März 2018' # 设置德语locale,不同系统写法可能不同:Linux用'de_DE.UTF-8',Windows用'German_Germany.1252' locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8') de_formatted = local_datetime.strftime('%d. %B %Y') print(de_formatted) # 输出:"8. März 2018"
注意:你例子里的年份从2018变成2016应该是笔误,上面的代码都用了和输入一致的2018年份哦~
内容的提问来源于stack exchange,提问作者Nahro




