首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何将ISO8601 TimeSpan转换为C# TimeSpan?

基础概念

ISO 8601 是一种国际标准,用于表示日期和时间。ISO 8601 时间间隔(TimeSpan)格式通常表示为 PnYnMnDTnHnMn.nS,其中:

  • P 表示时间段
  • nY 表示年数
  • nM 表示月数
  • nD 表示天数
  • T 表示时间部分
  • nH 表示小时数
  • nM 表示分钟数
  • n.nS 表示秒数(小数部分)

C# 中的 TimeSpan 结构体用于表示时间间隔,包含天数、小时数、分钟数、秒数和毫秒数。

相关优势

将 ISO 8601 时间间隔转换为 C# TimeSpan 的优势在于:

  1. 标准化:ISO 8601 是一种广泛接受的标准格式,便于跨平台和系统之间的数据交换。
  2. 灵活性:ISO 8601 格式可以表示复杂的时间间隔,而 C# TimeSpan 提供了方便的方法来处理这些时间间隔。

类型

  • ISO 8601 时间间隔:字符串格式,如 P1DT2H30M
  • C# TimeSpan:结构体类型,包含 Days, Hours, Minutes, Seconds, Milliseconds 等属性。

应用场景

在处理日期和时间数据时,特别是在需要跨平台或跨系统交换数据的情况下,使用 ISO 8601 格式并将其转换为 C# TimeSpan 是非常常见的。

转换方法

以下是将 ISO 8601 时间间隔转换为 C# TimeSpan 的示例代码:

代码语言:txt
复制
using System;
using System.Globalization;

public class Program
{
    public static void Main()
    {
        string iso8601TimeSpan = "P1DT2H30M";
        TimeSpan result = ParseIso8601TimeSpan(iso8601TimeSpan);
        
        Console.WriteLine($"Days: {result.Days}");
        Console.WriteLine($"Hours: {result.Hours}");
        Console.WriteLine($"Minutes: {result.Minutes}");
        Console.WriteLine($"Seconds: {result.Seconds}");
        Console.WriteLine($"Milliseconds: {result.Milliseconds}");
    }

    public static TimeSpan ParseIso8601TimeSpan(string iso8601TimeSpan)
    {
        if (string.IsNullOrEmpty(iso8601TimeSpan))
            throw new ArgumentException("ISO 8601 TimeSpan string cannot be null or empty.");

        // Remove the 'P' and 'T' characters
        string[] parts = iso8601TimeSpan.Replace("P", "").Replace("T", "").Split(new char[] { 'D', 'H', 'M', 'S' }, StringSplitOptions.RemoveEmptyEntries);

        int days = 0, hours = 0, minutes = 0, seconds = 0;

        foreach (string part in parts)
        {
            if (part.EndsWith("D"))
            {
                days = int.Parse(part.Replace("D", ""));
            }
            else if (part.EndsWith("H"))
            {
                hours = int.Parse(part.Replace("H", ""));
            }
            else if (part.EndsWith("M"))
            {
                minutes = int.Parse(part.Replace("M", ""));
            }
            else if (part.EndsWith("S"))
            {
                seconds = int.Parse(part.Replace("S", ""));
            }
        }

        return new TimeSpan(days, hours, minutes, seconds);
    }
}

参考链接

常见问题及解决方法

问题1:输入的 ISO 8601 时间间隔格式不正确

  • 原因:输入的字符串不符合 ISO 8601 标准格式。
  • 解决方法:在解析之前,使用正则表达式或其他验证方法检查输入字符串的格式是否正确。
代码语言:txt
复制
public static bool IsValidIso8601TimeSpan(string iso8601TimeSpan)
{
    if (string.IsNullOrEmpty(iso8601TimeSpan))
        return false;

    var regex = new System.Text.RegularExpressions.Regex(@"^P(\d+D)?(T(\d+H)?(\d+M)?(\d+(\.\d+)S)?)?$");
    return regex.IsMatch(iso8601TimeSpan);
}

问题2:解析过程中出现数字格式错误

  • 原因:ISO 8601 时间间隔中的数字部分可能包含非数字字符或格式不正确。
  • 解决方法:在解析每个时间单位时,使用 int.Parsedouble.Parse 进行转换,并捕获可能的异常。
代码语言:txt
复制
try
{
    days = int.Parse(part.Replace("D", ""));
}
catch (FormatException)
{
    throw new FormatException("Invalid format for days in ISO 8601 TimeSpan.");
}

通过以上方法,可以有效地将 ISO 8601 时间间隔转换为 C# TimeSpan,并处理常见的解析问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • C# 基础知识系列- 13 常见类库介绍(二)日期时间类

    前言 上一篇内容介绍了Console类和Math类,这篇内容着重介绍一下C#中时间日期的处理方式。 上一篇勘误:上一篇中关于静态类没有构造函数,这一表述有误。...正确的说法是C#中静态类不包含常规构造函数,但可以添加一个静态构造函数。...上述是时间转字符串,反过来也有字符串转时间。 使用DateTime.Parse或者Convert.ToDateTime就可以将字符串转换为时间类型。...C#并不需要在字符串转日期的时候指定字符串的显示格式,这是因为一个约定优于配置的设计理念。C#通过分析字符串,然后将字符串转换成对应的时间类型。当然,在正确解析到时间的时候,C#会抛出异常。...为此,C#提供了DateTime.TryParse方法,该方法不会抛出异常,会返回一个是否正确转换的bool值。

    2.2K30

    dotnet 将任意时区的 DateTimeOffset 转换为中国时区时间文本

    本文告诉大家在拿到任意时区的 DateTimeOffset 对象,将 DateTimeOffset 转换为使用中国的 +8 时区表示的时间 在开始之前,需要说明的是,采用 DateTimeOffset...= timeZoneInfo.GetUtcOffset(dateTimeOffset); 如此获取到的 TimeSpan 就是时区之间的差值,相加即可转换为目标国家地区的时间...var newDateTimeOffset = dateTimeOffset + timeSpan; 以上代码拿到的 newDateTime 就是转换后的时区时间 全部的代码如下,通过以下代码即可将任意时区的时间转换为中国对应的时区的时间...= dateTimeOffset.ToUniversalTime(); 接着直接执行 +8 小时即可转换为中国时间 TimeSpan timeSpan = TimeSpan.FromHours...; 以上就是转换为中国时间的方法

    1.6K40

    【100个 Unity实用技能】☀️ | Unity中C#获取当前时间戳,时间戳和时间格式相互转换、时间戳转换为多久之前

    ---- Unity C#获取当前时间戳,时间戳和时间格式相互转换、时间戳转换为多久之前 什么是时间戳 时间戳 一般是指格林威治时间1970年1月1日0时0分0秒起至现在的总毫秒数。...日期转为时间戳 //方法一 TimeSpan st = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0);...时间戳转时间 //方法一 DateTime startTime = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1, 0...TimeZoneInfo.Local); DateTime dt = startTime.AddMilliseconds(st);//st为传入的时间戳 Debug.Log("时间戳转时间...将时间戳转换为多久之前 的方法(此处方法传入的秒时间戳) /// /// 将秒数时间戳转换为多久之前。

    4K31

    在unity中使用三种简单的方式实现实时时钟动画

    什么是 TimeSpan? Timespan 将会代表很长的时间。我们可以在 C# 程序中创建或处理 Timespan 实例。 什么是 DataTime?...DateTime 将会在每一秒给我们一个日期和时间,Timespan 将会在每秒都进行更新,所以它将会给我们实时的输出效果。 什么是 Quaternion?...第三步 动画脚本 3.1 创建脚本 进入 Assets >> Script文件夹,右键点击并创建一个新的 C# 脚本。 命名为 ClockAnimation。 然后双击打开它。...2.使用 Timespan 来创建秒表(Stopwatch)。 3.逆时针旋转。...总结 所以在这我们可以得出这样的结论:使用 DataTime 将会获得秒数,而 Timespan 将会获得每秒的间隔,所以它看上去运行的很流畅。

    1.8K20

    C# 实现时间来到新的一天时触发事件

    C# 实现时间来到新的一天时触发事 独立观察员 2023 年 12 月 19 日 看到知乎有人提问《C# 如果要实现一个任务每天 0 点执行,用什么方法等待更高效?》...isRest = true) { if (isRest) { DateTime dtime = DateTime.Today.AddDays(1).Date; TimeSpan...return ts.TotalSeconds; } else { DateTime dtime = DateTime.Today.Date; TimeSpan...C#10 新特性 [调用方参数表达式] 解决了我七年前的困惑 【分享】C# 字节帮助类 ByteHelper C# 在自定义的控制台输出重定向类中整合调用方信息 C# 枚举转列表 .NET Windows...服务 同时启动多个服务 PostSharp 中 AOP 功能的简单使用 .NET SDK-Style 项目(Core、Standard、.NET5)中的版本号 将 .NET Framework 项目转换为

    32410
    领券