C# 从 time.ac.cn 获取标准北京时间的实现

Aria
Aria
发布时间:2026-10-14| 5人浏览过
原创

利用 C# 编写脚本或程序时,有时需要获取与网络标准时间同步的结果,以确保数据记录的时间准确性。本文将通过调用中国科学院国家授时中心(NCSM)提供的公开 API,演示如何抓取并解析标准北京时间。

原理与准备工作

中国科学院国家授时中心提供了一個公开的 HTTP 接口,用于向公众广播标准时间。该接口地址为 http://www.time.ac.cn/timeflash.asp?user=flash。当使用工具请求此地址时,服务器会返回一段标准的 XML 格式文本,其中包含了当年的年、月、日、时、分、秒等具体数值字段。

在 C# 中,我们可以使用 System.Net.WebRequest 和 System.IO.StreamReader 类来发起 HTTP GET 请求并读取返回的内容。需要注意的是,由于这是一个纯文本/HTML 交互,无需复杂的认证机制,但为了保证程序的健壮性,必须对网络异常情况做好捕获处理。

核心代码实现

以下是完整的 C# 静态方法实现,该方法命名为 GetStandardTime,用于返回一个表示北京时间的 DateTime 对象。

#region
/// <summary>
/// 获取标准北京时间
/// </summary>
/// <returns>标准北京时间 DateTime 对象</returns>
public static DateTime GetStandardTime()
{
    // NCSM 返回的 XML 结构大致如下:
    // <?xml version="1.0" encoding="GB2312" ?>
    // -<ntsc>
    //   -<time>
    //     <year>2013</year>
    //     <month>8</month>
    //     ... (hour, minute, second)
    //   </time>
    // </ntsc>

    DateTime dt = default;
    WebRequest wrt = null;
    WebResponse wrp = null;

    try
    {
        // 1. 创建请求对象
        wrt = WebRequest.Create("http://www.time.ac.cn/timeflash.asp?user=flash");
        // 2. 设置凭据(通常默认即可)
        wrt.Credentials = CredentialCache.DefaultCredentials;
        
        // 3. 获取响应
        wrp = wrt.GetResponse();
        
        // 4. 读取响应流,注意编码通常为 GB2312 或 UTF-8,此处尝试用 UTF-8 兼容读取
        using (StreamReader sr = new StreamReader(wrp.GetResponseStream(), Encoding.UTF8))
        {
            string html = sr.ReadToEnd();
            
            // 5. 解析 XML 中的日期时间片段
            int yearIndex = html.IndexOf("<year>") + 6;
            int monthIndex = html.IndexOf("<month>") + 7;
            int dayIndex = html.IndexOf("<day>") + 5;
            int hourIndex = html.IndexOf("<hour>") + 6;
            int miniteIndex = html.IndexOf("<minite>") + 8; // 注意:官网源码拼写为 minite
            int secondIndex = html.IndexOf("<second>") + 8;

            string year = html.Substring(yearIndex, html.IndexOf("</year>") - yearIndex);
            string month = html.Substring(monthIndex, html.IndexOf("</month>") - monthIndex);
            string day = html.Substring(dayIndex, html.IndexOf("</day>") - dayIndex);
            string hour = html.Substring(hourIndex, html.IndexOf("</hour>") - hourIndex);
            string minite = html.Substring(miniteIndex, html.IndexOf("</minite>") - miniteIndex);
            string second = html.Substring(secondIndex, html.IndexOf("</second>") - secondIndex);

            // 6. 拼接并转换为 DateTime
            string dateTimeString = $"{year}-{month}-{day} {hour}:{minite}:{second}";
            dt = DateTime.Parse(dateTimeString);
        }
    }
    catch (WebException)
    {
        // 网络错误或请求被拒绝时,返回一个默认时间(如 1970-01-01 或其他标识)
        return DateTime.Parse("2013-1-1");
    }
    catch (Exception)
    {
        // 其他解析错误
        return DateTime.Parse("2013-1-1");
    }
    finally
    {
        if (wrp != null)
            wrp.Close();
        if (wrt != null)
            wrt.Abort();
    }
    return dt;
}
#endregion

关键步骤说明

第一步:发起 HTTP 请求

使用 WebRequest.Create 初始化目标 URL 的请求对象。这一步建立了与 time.ac.cn 服务器的连接通道。参数 ?user=flash 是该接口常见的查询字符串,用于标识请求来源,非必须但建议保留以保证接口兼容性。

第二步:读取并缓存响应内容

通过 GetResponse() 获取 WebResponse 实例,并使用 StreamReader 将其输出流读取为字符串 html。将完整内容读入内存字符串后,后续的所有解析操作都在内存中进行,避免了重复的网络 I/O。

第三步:提取日期时间字段

由于返回的数据结构简单且固定,可以使用字符串搜索(IndexOf)定位标签位置。计算起始索引(标签名长度+开始标记长度)和子串长度(结束标签位置-开始位置),从而提取出年、月、日、时、分、秒的纯数字字符串。需注意官方返回 XML 中使用的是 <minite> 而非 <minute>,代码中需保持一致。

第四步:组装与类型转换

将提取的各部分字符串按 yyyy-MM-dd HH:mm:ss 格式拼接,然后利用 DateTime.Parse 将其转换为 .NET 的 DateTime 对象。此对象可用于后续的日志写入、数据库存储或 UI 显示。

注意事项与排错

  • 网络延迟:该接口位于互联网上,受网络状况影响较大,耗时可能在几百毫秒到几秒不等。若用于高精度定时任务,建议在后台线程异步执行,避免阻塞主界面或业务逻辑。
  • 编码问题:虽然示例中使用 Encoding.UTF8 读取,但部分旧版接口或特定网络环境下可能返回 GB2312 编码。如果解析出的中文乱码或时间缺失,可尝试将编码修改为 Encoding.GetEncoding("GB2312") 进行测试。
  • 默认值策略:示例代码在发生异常时返回 2013-1-1 作为占位符。在实际生产中,应将其替换为更合理的默认时间(如当前系统时间)或抛出自定义异常,以便上层调用者感知状态。

以上就是利用 C# 从网络同步标准北京时间的详细内容,更多关于 C# 时间处理与网络爬虫的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。