【运用场景】
当一个时间值有跨时区显示,那么就需要进行时间的转换
比如:前端页面输入的时间值应该表示的是当地时间值,数据库保存的值,应该要转为UTC值进行保存,假设用户的当地时间和UTC标准时间相差5个小时utc+5
用户填写时间:2022-05-11 18:05:00
数据库保存时间:2022-05-11 13:05:00
1、提示如下
2、原因
因为now的Kind是Local,表示当地时间,当前时间和源时区不一致导致报错
在转换的时间方法TimeZoneInfo.ConvertTime()
1)第一个参数,当前时间,此处是当地时间,Kind=Local,判定
2)第二个参数,源时区
3)第三个餐宿,表示目标时区
3、解决方法一
将第二个参数改为Local本地时区
- 效果
- 代码
DateTime now = DateTime.Now;
string now_kind = now.Kind.ToString(); //now_kind="Local" > 本地时间
string local_time_string = now.ToString("yyyy-MM-dd HH:mm:ss");
string time_zone_string = "Pakistan Standard Time"; //utc+3
DateTime local_time = Convert.ToDateTime(local_time_string);
string local_time_kind = local_time.Kind.ToString();
TimeZoneInfo time_zone_info_local = TimeZoneInfo.Local;
TimeZoneInfo time_zone_info_target = TimeZoneInfo.FindSystemTimeZoneById(time_zone_string);
DateTime target_time = TimeZoneInfo.ConvertTime(local_time, time_zone_info_local, time_zone_info_target);
4、解决方法二
直接转换成中间类型的Kind=Unspecified
5、解决方法三
转为直接使用两个参数,第一个是当前时间值,第二个是目标时区
6、获取时区值
var list = new List<object>();
var zone = TimeZoneInfo.GetSystemTimeZones();
foreach (var item in zone)
{
list.Add(new
{
item.Id,
item.DisplayName,
hours = item.BaseUtcOffset.Hours,
item.StandardName
});
}