如何在JavaScript中将Graph API的UTC DateTime转换为IST以匹配数据库?
问题:将Microsoft Graph API返回的UTC时间转换为IST时区并匹配数据库数据
你从Microsoft Graph API获取的事件时间数据如下:
"start": { "dateTime": "2022-09-17T12:00:00.0000000", "timeZone": "UTC" }, "end": { "dateTime": "2022-09-17T12:20:00.0000000", "timeZone": "UTC" }
该时间为UTC时区,而你的数据库中存储的事件时间为IST(印度标准时间,UTC+5:30)时区,需要将Graph返回的DateTime转换为IST格式后与数据库中的事件匹配,以下是可行的实现方法:
实现方法
1. C# 实现
利用TimeZoneInfo类完成时区转换:
// 解析Graph返回的UTC时间字符串 DateTime utcStartTime = DateTime.Parse("2022-09-17T12:00:00.0000000").ToUniversalTime(); DateTime utcEndTime = DateTime.Parse("2022-09-17T12:20:00.0000000").ToUniversalTime(); // 获取IST时区(系统时区ID为"India Standard Time") TimeZoneInfo istTimeZone = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"); // 转换为IST时间 DateTime istStartTime = TimeZoneInfo.ConvertTimeFromUtc(utcStartTime, istTimeZone); DateTime istEndTime = TimeZoneInfo.ConvertTimeFromUtc(utcEndTime, istTimeZone); // 格式化为数据库存储的字符串格式(示例为"yyyy-MM-dd HH:mm:ss") string formattedIstStart = istStartTime.ToString("yyyy-MM-dd HH:mm:ss"); string formattedIstEnd = istEndTime.ToString("yyyy-MM-dd HH:mm:ss"); // 直接用格式化后的字符串与数据库数据匹配即可
2. Python 实现
可使用Python 3.9+内置的zoneinfo模块,或兼容旧版本的pytz库:
方法一:使用zoneinfo(Python 3.9+)
from datetime import datetime from zoneinfo import ZoneInfo # 解析UTC时间字符串并绑定UTC时区 utc_start = datetime.fromisoformat("2022-09-17T12:00:00.0000000").replace(tzinfo=ZoneInfo("UTC")) utc_end = datetime.fromisoformat("2022-09-17T12:20:00.0000000").replace(tzinfo=ZoneInfo("UTC")) # 转换为IST时区(Asia/Kolkata对应印度标准时间) ist_start = utc_start.astimezone(ZoneInfo("Asia/Kolkata")) ist_end = utc_end.astimezone(ZoneInfo("Asia/Kolkata")) # 格式化为数据库存储的字符串格式 formatted_ist_start = ist_start.strftime("%Y-%m-%d %H:%M:%S") formatted_ist_end = ist_end.strftime("%Y-%m-%d %H:%M:%S")
方法二:使用pytz(兼容旧版本Python)
from datetime import datetime import pytz # 解析UTC时间字符串并绑定UTC时区 utc_start = datetime.strptime("2022-09-17T12:00:00.0000000", "%Y-%m-%dT%H:%M:%S.%f").replace(tzinfo=pytz.utc) utc_end = datetime.strptime("2022-09-17T12:20:00.0000000", "%Y-%m-%dT%H:%M:%S.%f").replace(tzinfo=pytz.utc) # 获取IST时区 ist_timezone = pytz.timezone("Asia/Kolkata") # 转换为IST时间 ist_start = utc_start.astimezone(ist_timezone) ist_end = utc_end.astimezone(ist_timezone) # 格式化为数据库存储格式 formatted_ist_start = ist_start.strftime("%Y-%m-%d %H:%M:%S") formatted_ist_end = ist_end.strftime("%Y-%m-%d %H:%M:%S")
3. SQL 直接转换(数据库端处理)
如果你的数据库支持时区转换,可直接在查询语句中完成转换,无需应用层处理:
MySQL 示例
-- 假设数据库中IST时间字段为ist_start_time、ist_end_time(DATETIME类型) SELECT * FROM events WHERE ist_start_time = CONVERT_TZ('2022-09-17 12:00:00', 'UTC', 'Asia/Kolkata') AND ist_end_time = CONVERT_TZ('2022-09-17 12:20:00', 'UTC', 'Asia/Kolkata');
PostgreSQL 示例
SELECT * FROM events WHERE ist_start_time = '2022-09-17T12:00:00.0000000'::TIMESTAMP WITH TIME ZONE AT TIME ZONE 'Asia/Kolkata' AND ist_end_time = '2022-09-17T12:20:00.0000000'::TIMESTAMP WITH TIME ZONE AT TIME ZONE 'Asia/Kolkata';
内容的提问来源于stack exchange,提问作者Ritik Joshi
相关产品推荐
相关产品推荐

