最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust時間庫Chrono最佳使用實踐

 更新時間:2026年01月13日 10:14:13   作者:碼刀攻城  
本文介紹了Rust中常用的日期時間處理庫chrono,對比了標準庫std::time和chrono的功能和適用場景,并詳細講解了chrono的核心數(shù)據(jù)類型、主要操作、進階功能以及最佳實踐,感興趣的朋友跟隨小編一起看看吧

在日常開發(fā)中,日期時間處理是高頻需求,涵蓋日志記錄、定時任務、數(shù)據(jù)統(tǒng)計、時區(qū)轉換等場景。Rust 標準庫雖提供了基礎的日期時間類型,但功能簡陋,缺乏時區(qū)支持、靈活格式化、時間計算等實用能力。而 chrono 庫作為 Rust 生態(tài)中最成熟的日期時間處理庫,完美彌補了標準庫的不足,提供了安全、高效、易用的 API,支持時區(qū)管理、格式化解析、時間運算等全場景功能。

前序

chrono 不是 Rust 的標準庫(官方內置庫),它是一個第三方庫(crate),但是它是 Rust 生態(tài)中事實上的標準日期時間處理庫。

?? 1. 它是“第三方”,但非常權威

  • 來源:它由 Rust 社區(qū)的開發(fā)者維護(主要作者是 lcnr 等),托管在 crates.io 上。
  • 地位:雖然不是官方內置,但因為它功能強大、設計優(yōu)秀,幾乎所有的 Rust 項目(包括很多官方示例)都會選擇它來處理時間。你可以把它理解為“官方推薦的標配插件”。

?? 2. 真正的“官方”時間庫在哪里?
Rust 的標準庫(std)中其實也有一個非?;A的時間模塊,叫做 std::time。

  • 它能做什么:提供最基礎的功能,比如計算代碼運行了多久(Duration)、獲取系統(tǒng)啟動以來的時間點(Instant)。
  • 它不能做什么:它無法處理“2024年3月15日”這種人類可讀的日期,也不能處理時區(qū)、日歷等復雜功能。

?? 3. 為什么標準庫不包含完整的時間功能?
Rust 的標準庫設計哲學是**“保持精簡”**,只包含最核心、所有程序都絕對需要的功能。

  • std::time:滿足系統(tǒng)編程、性能計時等底層需求。
  • chrono:滿足應用開發(fā)、業(yè)務邏輯等上層需求。

?? 總結對比

特性chrono (你要用的)std::time (內置的)
類型第三方庫 (crate)Rust 標準庫 (官方內置)
功能強大:日期、時區(qū)、格式化、日歷計算基礎:僅限計時、納秒精度時間戳
適用場景顯示時間給用戶、日志記錄、業(yè)務邏輯測量函數(shù)執(zhí)行時間、超時控制
是否需要聯(lián)網(wǎng)下載是 (需要寫在 Cargo.toml)否 (自帶)

結論: chrono雖然它不是“親兒子”,但它是 Rust 社區(qū)公認的“最佳實踐”。

一、環(huán)境準備:引入 Chrono 庫

首先需在項目的 Cargo.toml中引入 Chrono 依賴,根據(jù)需求選擇核心功能或擴展特性(如時區(qū)數(shù)據(jù)庫、序列化支持)。

1. 基礎依賴(核心功能)

僅需基礎日期時間處理(本地時間、UTC、格式化),引入核心依賴即可:

[dependencies]
chrono = "0.4"  # 穩(wěn)定版,生態(tài)兼容度最高

2. 擴展依賴(進階功能)

若需時區(qū)轉換(非本地/UTC時區(qū))、序列化(與 serde 搭配),需開啟對應特性:

[dependencies]
chrono = { version = "0.4", features = ["serde", "tzdb"] }
# serde:支持日期時間類型的序列化/反序列化
# tzdb:包含完整時區(qū)數(shù)據(jù)庫(如 Asia/Shanghai、America/New_York)

提示:tzdb 特性依賴系統(tǒng)網(wǎng)絡(首次構建時下載時區(qū)數(shù)據(jù)),若需離線使用,可替換為 oldtime 特性(舊版時區(qū)數(shù)據(jù)庫,體積較小但更新不及時)。

二、核心數(shù)據(jù)類型:理解 Chrono 的數(shù)據(jù)模型

Chrono 庫的核心設計是“區(qū)分帶時區(qū)與無時區(qū)日期時間”,避免因時區(qū)模糊導致的邏輯錯誤。核心數(shù)據(jù)類型分為兩大類,覆蓋不同使用場景。

1. 無時區(qū)類型(Naive 系列)

“Naive”意為“樸素的”,此類類型不包含時區(qū)信息,僅表示“某個時間點的字面描述”,適用于本地場景、無需跨時區(qū)交互的場景(如日志本地時間戳)。

  • NaiveDate:僅包含日期(年、月、日),無時間、時區(qū)。
  • NaiveTime:僅包含時間(時、分、秒、納秒),無日期、時區(qū)。
  • NaiveDateTime:組合日期與時間,無時區(qū)(最常用的無時區(qū)類型)。

示例:創(chuàng)建與使用 Naive 類型

use chrono::{NaiveDate, NaiveTime, NaiveDateTime};
fn main() {
    // 1. 創(chuàng)建 NaiveDate(年-月-日)
    let date = NaiveDate::from_ymd_opt(2026, 1, 12).unwrap();
    println!("NaiveDate:{}", date);  // 輸出:2026-01-12
    // 2. 創(chuàng)建 NaiveTime(時:分:秒.納秒)
    let time = NaiveTime::from_hms_nano_opt(14, 30, 45, 123456789).unwrap();
    println!("NaiveTime:{}", time);  // 輸出:14:30:45.123456789
    // 3. 組合為 NaiveDateTime
    let dt = NaiveDateTime::new(date, time);
    println!("NaiveDateTime:{}", dt);  // 輸出:2026-01-12T14:30:45.123456789
    // 4. 從字符串解析 NaiveDateTime(指定格式)
    let dt_str = "2026-01-12 14:30:45";
    let parsed_dt = NaiveDateTime::parse_from_str(dt_str, "%Y-%m-%d %H:%M:%S").unwrap();
    println!("解析后的 NaiveDateTime:{}", parsed_dt);
}

注意:from_ymd_optfrom_hms_nano_opt 是安全構造方法,返回 Option(無效日期時間返回 None),避免直接使用已廢棄的非安全方法(如 from_ymd,無效值會觸發(fā) panic)。

2. 帶時區(qū)類型(DateTime 系列)

此類類型包含時區(qū)信息,能精確表示“全球唯一的時間點”,適用于跨時區(qū)交互場景(如國際業(yè)務、分布式系統(tǒng)日志)。核心類型為 DateTime<Tz>,其中 Tz 是時區(qū)類型,Chrono 提供兩種常用時區(qū)實現(xiàn):

  • Local:本地時區(qū)(跟隨系統(tǒng)時區(qū)變化)。
  • Utc:UTC 時區(qū)(世界協(xié)調時間,無夏令時,全球統(tǒng)一)。
  • 自定義時區(qū)(如 Asia::Shanghai、Europe::London,需開啟 tzdb 特性)。

示例:創(chuàng)建與使用帶時區(qū) DateTime

use chrono::{DateTime, Local, Utc, TimeZone};
// 開啟 tzdb 特性后可引入自定義時區(qū)
use chrono_tz::Asia::Shanghai;
fn main() {
    // 1. 獲取當前 UTC 時間
    let utc_now: DateTime<Utc> = Utc::now();
    println!("當前 UTC 時間:{}", utc_now);  // 輸出:2026-01-12T06:30:45.123456789Z(Z 表示 UTC)
    // 2. 獲取當前本地時間
    let local_now: DateTime<Local> = Local::now();
    println!("當前本地時間:{}", local_now);  // 輸出:2026-01-12T14:30:45.123456789+08:00(+08:00 表示時區(qū)偏移)
    // 3. 獲取指定時區(qū)當前時間(需 tzdb 特性)
    let shanghai_now: DateTime<chrono_tz::Tz> = Shanghai::now();
    println!("上海當前時間:{}", shanghai_now);  // 輸出:2026-01-12T14:30:45.123456789+08:00
    // 4. 將 NaiveDateTime 綁定到指定時區(qū)
    let naive_dt = NaiveDateTime::from_ymd_hms_opt(2026, 1, 12, 14, 30, 45).unwrap();
    let shanghai_dt = Shanghai.from_local_datetime(&naive_dt).unwrap();
    println!("綁定時區(qū)后的時間:{}", shanghai_dt);
}

補充:chrono_tz 是 Chrono 配套的時區(qū)庫,開啟 tzdb 特性后自動依賴,提供全球所有時區(qū)的預定義常量,避免手動構造時區(qū)。

三、核心操作:日期時間的格式化、解析與計算

Chrono 提供了豐富的 API 用于日期時間的格式化(轉為字符串)、解析(字符串轉對象)、運算(加減、比較),覆蓋日常開發(fā)絕大多數(shù)場景。

1. 格式化:日期時間轉字符串

通過 format 方法結合格式化占位符,可自定義日期時間字符串格式。常用占位符如下:

  • 日期:%Y(4位年)、%m(2位月)、%d(2位日)、%A(星期全稱)。
  • 時間:%H(24小時制時)、%I(12小時制時)、%M(2位分)、%S(2位秒)、%f(微秒)。
  • 時區(qū):%z(時區(qū)偏移,如 +0800)、%Z(時區(qū)名稱,如 CST)。

示例:自定義格式化日期時間

use chrono::{Utc, Local};
fn main() {
    let utc_now = Utc::now();
    let local_now = Local::now();
    // 1. 格式化 UTC 時間(帶時區(qū)標識)
    let utc_format = utc_now.format("%Y-%m-%d %H:%M:%S.%f UTC").to_string();
    println!("格式化 UTC 時間:{}", utc_format);  // 輸出:2026-01-12 06:30:45.123456 UTC
    // 2. 格式化本地時間(帶星期、時區(qū)偏移)
    let local_format = local_now.format("%Y年%m月%d日 %A %H:%M:%S %z").to_string();
    println!("格式化本地時間:{}", local_format);  // 輸出:2026年01月12日 Sunday 14:30:45 +0800
    // 3. 簡潔格式(預定義風格,無需手動寫占位符)
    let iso_format = local_now.to_rfc3339();  // RFC3339 標準格式
    println!("RFC3339 格式:{}", iso_format);  // 輸出:2026-01-12T14:30:45.123456+08:00
}

2. 解析:字符串轉日期時間

通過 parse_from_str(帶時區(qū)字符串)、parse_from_rfc3339(RFC3339 格式)等方法,可將字符串解析為對應的日期時間對象,核心是保證占位符與字符串格式完全匹配。

示例:解析不同格式的日期時間字符串

use chrono::{DateTime, Utc, Local, NaiveDateTime};
use chrono_tz::Asia::Shanghai;
fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 解析無時區(qū)字符串為 NaiveDateTime
    let naive_str = "2026-01-12 14:30:45";
    let naive_dt = NaiveDateTime::parse_from_str(naive_str, "%Y-%m-%d %H:%M:%S")?;
    println!("解析無時區(qū)時間:{}", naive_dt);
    // 2. 解析帶時區(qū)字符串為 DateTime<Utc>
    let utc_str = "2026-01-12T06:30:45Z";  // Z 表示 UTC
    let utc_dt = DateTime::parse_from_rfc3339(utc_str)?.with_timezone(&Utc);
    println!("解析 UTC 時間:{}", utc_dt);
    // 3. 解析帶時區(qū)偏移的字符串為指定時區(qū)時間
    let sh_str = "2026-01-12 14:30:45 +08:00";
    let sh_dt = DateTime::parse_from_str(sh_str, "%Y-%m-%d %H:%M:%S %z")?
        .with_timezone(&Shanghai);
    println!("解析上海時區(qū)時間:{}", sh_dt);
    Ok(())
}

注意:解析操作可能失敗(格式不匹配、無效日期時間),需通過 Result 處理錯誤,避免直接 unwrap(生產環(huán)境建議針對性捕獲錯誤)。

3. 時間計算:加減、差值與比較

Chrono 支持日期時間與 Duration(時間段)的加減運算,也支持兩個日期時間的差值計算、大小比較,API 直觀易懂。

示例:時間計算與比較

use chrono::{Local, Duration};
fn main() {
    let now = Local::now();
    println!("當前時間:{}", now);
    // 1. 時間加減(Duration 支持天、時、分、秒、納秒)
    let one_hour_later = now + Duration::hours(1);
    let two_days_ago = now - Duration::days(2);
    println!("1小時后:{}", one_hour_later);
    println!("2天前:{}", two_days_ago);
    // 2. 計算兩個時間的差值
    let diff = one_hour_later - now;
    println!("時間差:{} 秒", diff.num_seconds());  // 輸出:3600
    println!("時間差:{} 分鐘", diff.num_minutes());  // 輸出:60
    // 3. 時間大小比較
    println!("1小時后是否晚于當前時間:{}", one_hour_later > now);  // true
    println!("2天前是否早于當前時間:{}", two_days_ago < now);  // true
    println!("當前時間是否等于自身:{}", now == now);  // true
    // 4. 取整操作(截斷到指定單位)
    let truncated = now.trunc_subsecs(0);  // 截斷納秒,保留到秒
    println!("截斷到秒的時間:{}", truncated);  // 輸出:2026-01-12T14:30:45+08:00
}

補充:Duration 是 Chrono 內置的時間段類型,也可與 Rust 標準庫的 std::time::Duration 相互轉換(通過 into 方法)。

四、進階拓展:時區(qū)轉換、序列化與實戰(zhàn)場景

除基礎操作外,Chrono 還支持時區(qū)轉換、序列化/反序列化、定時器結合等進階功能,適配復雜業(yè)務場景,下面結合示例講解。

1. 時區(qū)轉換:跨時區(qū)時間同步

帶時區(qū)的 DateTime 可通過 with_timezone 方法轉換到任意時區(qū),底層自動處理時區(qū)偏移和夏令時(若時區(qū)支持)。

示例:跨時區(qū)轉換

use chrono::{DateTime, Utc};
use chrono_tz::{Asia::Shanghai, America::New_York, Europe::London};
fn main() {
    // 獲取當前 UTC 時間(全球統(tǒng)一基準)
    let utc_now = Utc::now();
    println!("UTC 時間:{}", utc_now);
    // 轉換為上海時區(qū)(UTC+8)
    let shanghai_dt = utc_now.with_timezone(&Shanghai);
    println!("上海時間:{}", shanghai_dt);
    // 轉換為紐約時區(qū)(UTC-5 或 UTC-4,夏令時變化)
    let new_york_dt = utc_now.with_timezone(&New_York);
    println!("紐約時間:{}", new_york_dt);
    // 轉換為倫敦時區(qū)(UTC+0 或 UTC+1,夏令時變化)
    let london_dt = utc_now.with_timezone(&London);
    println!("倫敦時間:{}", london_dt);
    // 不同時區(qū)時間互轉
    let ny_to_sh = new_york_dt.with_timezone(&Shanghai);
    println!("紐約時間轉上海時間:{}", ny_to_sh);
}

最佳實踐:分布式系統(tǒng)、跨區(qū)域業(yè)務建議統(tǒng)一使用 UTC 時間存儲和傳輸,展示時再轉換為用戶本地時區(qū),避免時區(qū)混亂。

2. 序列化與反序列化:與 Serde 搭配

開啟 serde 特性后,Chrono 的日期時間類型可直接與 Serde 框架搭配,支持 JSON、YAML 等格式的序列化/反序列化,無需手動處理格式轉換。

示例:JSON 序列化/反序列化

use chrono::{DateTime, Utc, Local};
use serde::{Serialize, Deserialize};
use serde_json;
// 定義包含日期時間的結構體
#[derive(Debug, Serialize, Deserialize)]
struct Event {
    name: String,
    // 序列化時默認使用 RFC3339 格式
    utc_time: DateTime<Utc>,
    local_time: DateTime<Local>,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let event = Event {
        name: "技術分享會".to_string(),
        utc_time: Utc::now(),
        local_time: Local::now(),
    };
    // 序列化為 JSON 字符串
    let json_str = serde_json::to_string_pretty(&event)?;
    println!("序列化后的 JSON:\n{}", json_str);
    // 反序列化 JSON 字符串為結構體
    let deserialized_event: Event = serde_json::from_str(&json_str)?;
    println!("反序列化后的事件:{:?}", deserialized_event);
    Ok(())
}

補充:若需自定義序列化格式(如非 RFC3339 格式),可通過 Serde 的 with 屬性指定自定義處理函數(shù)。

3. 實戰(zhàn)場景:定時器與日志時間戳

Chrono 常與異步運行時(如 Tokio)搭配實現(xiàn)定時器功能,也可用于生成日志的時間戳,下面結合兩個實戰(zhàn)場景示例。

示例1:基于 Tokio 的定時任務

use chrono::{Local, Duration};
use tokio::time;
#[tokio::main]
async fn main() {
    println!("定時任務啟動時間:{}", Local::now());
    // 每隔 2 秒執(zhí)行一次任務(結合 Chrono 的 Duration)
    let mut interval = time::interval(Duration::seconds(2).into());
    loop {
        interval.tick().await;
        println!("定時任務執(zhí)行時間:{}", Local::now());
    }
}

示例2:日志時間戳格式化(與 log 庫搭配)

use chrono::Local;
use log::{info, warn};
use env_logger::{Builder, Env};
fn main() {
    // 配置日志格式,加入 Chrono 格式化的時間戳
    Builder::from_env(Env::default().default_filter_or("info"))
        .format(|buf, record| {
            let now = Local::now().format("%Y-%m-%d %H:%M:%S.%f").to_string();
            writeln!(
                buf,
                "[{}] [{}] {}",
                now,
                record.level(),
                record.args()
            )
        })
        .init();
    info!("程序啟動成功");
    warn!("注意:即將執(zhí)行敏感操作");
    info!("操作執(zhí)行完成");
}

輸出效果:[2026-01-12 14:30:45.123456] [INFO] 程序啟動成功。

五、最佳實踐與常見問題

1. 最佳實踐

  • 優(yōu)先使用帶時區(qū)類型:跨場景、跨區(qū)域業(yè)務避免使用 Naive 類型,防止時區(qū)歧義導致邏輯錯誤。
  • 統(tǒng)一時間基準:存儲、傳輸時間優(yōu)先使用 UTC,展示時轉換為本地時區(qū),簡化跨時區(qū)交互。
  • 安全構造與錯誤處理:使用 from_ymd_opt、from_hms_nano_opt 等安全方法構造對象,解析操作需妥善處理 Result 錯誤。
  • 合理選擇特性:無需時區(qū)轉換時不開啟 tzdb 特性,減少依賴體積;無需序列化時不開啟 serde 特性。

2. 常見問題

  • 時區(qū)轉換異常:檢查是否開啟 tzdb 特性,是否正確引入 chrono_tz 庫,避免手動構造無效時區(qū)。
  • 解析失敗:確認占位符與字符串格式完全匹配(如 %Y 對應4位年,%y 對應2位年),避免多余空格或字符。
  • 夏令時問題:使用 chrono_tz 預定義時區(qū),自動處理夏令時偏移,無需手動調整。

六、總結

Chrono 庫通過清晰的數(shù)據(jù)模型(區(qū)分帶時區(qū)/無時區(qū)類型)、豐富的 API、完善的拓展特性,成為 Rust 日期時間處理的首選庫。從基礎的格式化、解析、計算,到進階的時區(qū)轉換、序列化、實戰(zhàn)場景適配,Chrono 覆蓋了從簡單業(yè)務到復雜系統(tǒng)的全場景需求。

使用 Chrono 時,核心是把握“時區(qū)一致性”原則,優(yōu)先使用 UTC 作為基準時間,結合實際場景選擇合適的數(shù)據(jù)類型和特性,同時注重錯誤處理,避免因日期時間問題導致的業(yè)務異常。掌握本文內容后,即可從容應對 Rust 開發(fā)中的各類日期時間處理需求。

到此這篇關于Rust時間庫Chrono最佳使用實踐的文章就介紹到這了,更多相關Rust時間庫Chrono內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 使用Rust語言搞定圖片上傳功能的示例詳解

    使用Rust語言搞定圖片上傳功能的示例詳解

    這篇文章主要為大家詳細介紹了如何使用Rust語言搞定圖片上傳功能,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2025-08-08
  • Rust中枚舉與模式匹配的使用

    Rust中枚舉與模式匹配的使用

    本文主要介紹了Rust中枚舉與模式匹配的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-06-06
  • 如何用Rust打印hello world

    如何用Rust打印hello world

    這篇文章主要介紹了如何用Rust打印hello world,本文分步驟通過圖文并茂的形式給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • Rust安裝的圖文教程

    Rust安裝的圖文教程

    本文主要介紹了Rust安裝的圖文教程,文中通過圖文示例介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-06-06
  • Rust裸指針的安全性實例講解

    Rust裸指針的安全性實例講解

    裸指針是一個不包含所有權和借用關系的原始指針,它們與常規(guī)指針相比沒有任何限制和保護措施,這篇文章主要介紹了Rust裸指針的安全性實例,需要的朋友可以參考下
    2023-05-05
  • rust開發(fā)環(huán)境配置詳細教程

    rust開發(fā)環(huán)境配置詳細教程

    rust是一門比較新的編程語言,2015年5月15日,Rust編程語言核心團隊正式宣布發(fā)布Rust 1.0版本,這篇文章主要介紹了rust開發(fā)環(huán)境配置 ,需要的朋友可以參考下
    2022-12-12
  • Rust語言之結構體和枚舉的用途與高級功能詳解

    Rust語言之結構體和枚舉的用途與高級功能詳解

    Rust 是一門注重安全性和性能的現(xiàn)代編程語言,其中結構體和枚舉是其強大的數(shù)據(jù)類型之一,了解結構體和枚舉的概念及其高級功能,將使你能夠更加靈活和高效地處理數(shù)據(jù),本文將深入探討 Rust 中的結構體和枚舉,并介紹它們的用途和高級功能
    2023-10-10
  • Rust中用enum實現(xiàn)多參數(shù)Hook機制完整代碼

    Rust中用enum實現(xiàn)多參數(shù)Hook機制完整代碼

    在 Rust 中,如果想為enum實現(xiàn)一個帶多參數(shù)的 Hook 機制,可以結合模式匹配和枚舉來處理,這種方式可以擴展到支持不同類型的輸入?yún)?shù)和邏輯處理,下面通過示例代碼介紹Rust中用enum實現(xiàn)多參數(shù)Hook機制,感興趣的朋友一起看看吧
    2024-12-12
  • R語言ggplot2繪圖安裝與調試

    R語言ggplot2繪圖安裝與調試

    ggplot2是R語言中最常用的繪圖包之一,它提供了一種基于圖層的繪圖語法,使得用戶可以輕松地創(chuàng)建高質量的數(shù)據(jù)可視化圖表。在使用ggplot2之前,需要先安裝該包并進行調試。安裝ggplot2可以通過CRAN或GitHub進行,調試則需要注意數(shù)據(jù)格式、語法錯誤等問題。
    2023-06-06
  • Rust中多線程?Web?服務器的項目實戰(zhàn)

    Rust中多線程?Web?服務器的項目實戰(zhàn)

    本文主要介紹了Rust中多線程?Web?服務器的項目實戰(zhàn),利用通道和互斥鎖管理任務隊列,解決單線程處理請求的性能瓶頸,確保并發(fā)處理能力并實現(xiàn)優(yōu)雅關閉機制
    2025-06-06

最新評論

合作市| 铜梁县| 天峨县| 高雄市| 醴陵市| 阳原县| 石家庄市| 怀化市| 铜川市| 左云县| 建湖县| 木兰县| 定安县| 拉萨市| 平安县| 景宁| 利津县| 平阳县| 巴彦县| 台中市| 团风县| 石阡县| 宜宾县| 海安县| 萨嘎县| 万宁市| 右玉县| 高陵县| 霍林郭勒市| 盈江县| 北安市| 清丰县| 运城市| 安远县| 城口县| 台北县| 永嘉县| 鄄城县| 怀安县| 喀喇沁旗| 临沧市|