Rust中如何将加尔各答时区时间转为UTC?代码报错求解
将加尔各答时区的DateTime转换为UTC的DateTime实例
你遇到的问题根源在于from_local_datetime方法的返回值——它返回的是LocalResult<DateTime<Tz>>,而不是直接的DateTime对象。这个类型是chrono库用来处理本地时间可能存在歧义或完全不存在的场景(比如夏令时切换期间,时钟回拨会导致同一个本地时间对应两个时区时间,或者时钟跳过导致某个本地时间不存在),所以它并没有naive_utc方法。
要完成时区转换,你需要先处理这个LocalResult,再调用正确的时区转换方法。下面是具体的解决方案:
步骤1:处理LocalResult并转换时区
首先确保你已经导入了必要的依赖模块(假设你用的是chrono-tz库来获取加尔各答时区):
use chrono::{NaiveDate, DateTime, Utc, LocalResult}; use chrono_tz::Asia::Kolkata;
然后修正你的代码,通过match处理LocalResult的三种可能情况,再用with_timezone(&Utc)把加尔各答时区的时间转换为UTC:
fn main() { let nd_local = NaiveDate::from_ymd(2020, 10, 10).and_hms(10, 10, 10); let time_at_kolkata = Kolkata.from_local_datetime(&nd_local); match time_at_kolkata { // 情况1:本地时间唯一对应一个时区时间 LocalResult::Single(dt_kolkata) => { let dt_utc: DateTime<Utc> = dt_kolkata.with_timezone(&Utc); println!("KOLKATA_TIME {:?}", dt_kolkata); println!("UTC TIME {:?}", dt_utc); } // 情况2:本地时间对应两个时区时间(比如夏令时结束时钟回拨) LocalResult::Ambiguous(dt1, dt2) => { println!("注意:该时间存在歧义,对应两个时区值:{:?} 和 {:?}", dt1, dt2); // 这里可以根据业务逻辑选择其中一个,比如选第一个 let dt_utc = dt1.with_timezone(&Utc); println!("转换后的UTC时间(选第一个值):{:?}", dt_utc); } // 情况3:本地时间在该时区不存在(比如夏令时开始时钟跳过) LocalResult::None => { println!("错误:该本地时间在加尔各答时区不存在!"); } } }
简化写法(仅适用于确定无歧义的场景)
如果你的输入时间绝对不会出现歧义或不存在的情况(比如加尔各答时区没有夏令时,你例子中的2020-10-10这个时间是完全安全的),可以用unwrap()快速获取DateTime对象,但这种写法在生产环境要谨慎使用(如果遇到异常时间会 panic):
fn main() { let nd_local = NaiveDate::from_ymd(2020, 10, 10).and_hms(10, 10, 10); // 直接unwrap获取加尔各答时区的DateTime let dt_kolkata = Kolkata.from_local_datetime(&nd_local).unwrap(); // 转换为UTC let dt_utc: DateTime<Utc> = dt_kolkata.with_timezone(&Utc); println!("KOLKATA_TIME {:?}", dt_kolkata); println!("UTC TIME {:?}", dt_utc); }
关键知识点
with_timezone(&Utc)是chrono库中转换时区的标准方法,它可以把任意时区的DateTime<Tz>实例转换成DateTime<Utc>。- 永远不要忽略
LocalResult的处理,即使你觉得输入时间没问题——这能避免潜在的运行时错误,也让代码更健壮。
内容的提问来源于stack exchange,提问作者Asnim P Ansari
相关产品推荐
相关产品推荐

