目录
五、时间比较
六、时间数据转换
七、时间间隔计算
八、获取网络时间
九、时间戳
十、时区时间
结束
概述
 在 C# 中,DateTime 用于处理日期和时间的内置类,其值范围为 00:00:00 (午夜) , 0001年1月1日,安诺·多米尼 (公历) 年12月31日晚上11:59:59 (公历 ) 。
时间值以 100 纳秒为单位进行测量,称为刻度。 特定日期是自 A.0001 年 1 月 1 日午夜 12:00 以来的时钟周期数, (日历中的 GregorianCalendar C.E.) 。 该数字不包括按闰秒添加的刻度。 例如,刻度值为 31241376000000000L 表示星期五,0100 年 1 月 1 日 12:00:00 午夜。 DateTime 值始终在显式或默认日历的上下文中表示。
C# 时间计算(一)-CSDN博客
五、时间比较
要想两个时间比较谁早谁晚,有多种方法,可以使用 TimeSpan,DateTime,DateTimeOffset 等
例1:
直接用大于号,小于号运算符判断
代码:
namespace Test2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            DateTime dt1 = DateTime.Parse("2023-11-24 19:30:23");
            DateTime dt2 = DateTime.Parse("2023-11-24 23:10:51");
            if(dt1 > dt2)
            {
                Console.WriteLine("dt1 时间大于 dt2");
            }
            else if(dt2 > dt1)
            {
                Console.WriteLine("dt2 时间大于 dt1");
            }
            else
            {
                Console.WriteLine("两个时间相同");
            }
            Console.ReadKey();
        }
    }
} 
效果:

例2:
使用 CompareTo 来判断两个时间,谁大谁小
代码:
namespace Test2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            DateTime dt1 = DateTime.Parse("2023-11-24 19:30:23");
            DateTime dt2 = DateTime.Parse("2023-11-24 23:10:51");
            // 1 表示第一个时间晚于第二个时间,(时间1 大于 时间2)
            // 0 表示两个时间相等,
            //-1 表示第一个时间早于第二个时间(时间1 小于 时间2)
            int result = dt1.CompareTo(dt2);
            Console.WriteLine("结果:{0}", result);
            Console.ReadKey();
        }
    }
} 
运行:

例3:
使用 DateTime.Compare 效果同例2效果一致
代码:
namespace Test2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            DateTime dt1 = DateTime.Parse("2023-11-24 19:30:23");
            DateTime dt2 = DateTime.Parse("2023-11-24 23:10:51");
            // 1 表示第一个时间晚于第二个时间,(时间1 大于 时间2)
            // 0 表示两个时间相等,
            //-1 表示第一个时间早于第二个时间(时间1 小于 时间2)
            int result = DateTime.Compare(dt1, dt2);
            Console.WriteLine("结果:{0}", result);
            Console.ReadKey();
        }
    }
} 
 
六、时间数据转换
时间数据转换是指将分钟转换为秒,或者将秒转换小时等等。
现在有个问题,我们去电影院看电影,如果电影的时长是 280分钟,那么它是多少小时,多少分钟呢?
如果我们手动去计算,一般是用 280 / 60 得出小时数,然后将 280 % 60 得出分钟数量,但是,大部分人口算 280 / 60 也不太容易,用乘法去算反而更容易点,4 * 60 = 240,280 - 240 = 40,应该是 4小时40分吧,那么下面我就用代码的方式来解决这个问题吧。
例1:
将分钟转换为 小时、分钟
代码:
namespace Test2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            TimeSpan timeSpan = TimeSpan.FromMinutes(280);
            Console.WriteLine(timeSpan);
            Console.ReadKey();
        }
    }
} 
效果:

例2:
我在 C# 中写了一个定时器,定时器要求我必须用毫秒计算,那么 1 小时的毫秒数是多少呢
代码:
Timer = new System.Timers.Timer();
Timer.Interval = TimeSpan.FromHours(1).TotalMilliseconds;
Timer.Elapsed += Timer_Elapsed;
Timer.AutoReset = true; 
上面的代码并不完整,重点在 TimeSpan.FromHours(1).TotalMilliseconds 这句
代码:
namespace Test2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            double mills = TimeSpan.FromHours(1).TotalMilliseconds;
            Console.WriteLine("毫秒数:{0}", mills);
            Console.ReadKey();
        }
    }
} 
效果:

例3:
12分钟是多少毫秒?
代码:
namespace Test2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            double mills = TimeSpan.FromMinutes(12).TotalMilliseconds;
            Console.WriteLine("毫秒数:{0}", mills);
            Console.ReadKey();
        }
    }
} 
效果:

七、时间间隔计算
可以使用 TimeSpan 来判断两个时间之间间隔了多少秒
代码:
namespace Test2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            DateTime dt1 = DateTime.Parse("2023-11-24 19:30:23");
            DateTime dt2 = DateTime.Parse("2023-11-24 23:10:51");
            TimeSpan timeSpan = dt2 - dt1;
            int seconds = (int)timeSpan.TotalSeconds;
            Console.WriteLine("两个时间之间间隔秒数:{0}", seconds);
            Console.ReadKey();
        }
    }
} 
效果:

也可以对间隔时间的计算做一个封装,新建一个类 TimeInterval
using System;
/// <summary>
/// 时间差计算
/// </summary>
public class TimeInterval
{
    /// <summary>
    /// 计算两个时间间隔的时长
    /// </summary>
    /// <param name="TimeType">返回的时间类型</param>
    /// <param name="StartTime">开始时间</param>
    /// <param name="EndTime">结束时间</param>
    /// <returns>返回间隔时间,间隔的时间类型根据参数 TimeType 区分</returns>
    public static double GetSpanTime(TimeType TimeType, DateTime StartTime, DateTime EndTime)
    {
        TimeSpan ts1 = new TimeSpan(StartTime.Ticks);
        TimeSpan ts2 = new TimeSpan(EndTime.Ticks);
        TimeSpan ts = ts1.Subtract(ts2).Duration();
        double result = 0f;
        switch (TimeType)
        {
            case TimeType.MilliSecond:
                result = ts.TotalMilliseconds;
                break;
            case TimeType.Seconds:
                result = ts.TotalSeconds;
                break;
            case TimeType.Minutes:
                result = ts.TotalMinutes;
                break;
            case TimeType.Hours:
                result = ts.TotalHours;
                break;
            case TimeType.Days:
                result = ts.TotalDays;
                break;
        }
        return result;
    }
    
    private TimeInterval() { }
}
/// <summary>
/// 时间类型
/// </summary>
public enum TimeType
{
    /// <summary>
    /// 毫秒
    /// </summary>
    MilliSecond,
    /// <summary>
    /// 秒
    /// </summary>
    Seconds,
    /// <summary>
    /// 分钟
    /// </summary>
    Minutes,
    /// <summary>
    /// 小时
    /// </summary>
    Hours,
    /// <summary>
    /// 天
    /// </summary>
    Days,
    /// <summary>
    /// 月
    /// </summary>
    Months
}
 
调用:
namespace Test2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            DateTime dt1 = DateTime.Parse("2023-11-24 19:30:23");
            DateTime dt2 = DateTime.Parse("2023-11-24 23:10:51");
            double seconds = TimeInterval.GetSpanTime(TimeType.Seconds, dt1, dt2);
            Console.WriteLine("两个时间之间间隔秒数:{0}", seconds);
            Console.ReadKey();
        }
    }
} 
效果:

八、获取网络时间
获取网络时间,主要是找到对应的服务器接口,如果你有自己的服务器,那么实现起来就非常简单,自己写一个 WebAPI 接口,使用 C# 发送 get 请求就可以获取到网络时间了。
通过下面的方法也可以获取到当前的时间, time.nist.gov 是国外的一个时间校验的接口,你可以通过下面方法获取到当前的北京时间。
示例:
private static DateTime GetInternetDate()
{
    var client = new TcpClient("time.nist.gov", 13);
    using (var streamReader = new StreamReader(client.GetStream()))
    {
        var response = streamReader.ReadToEnd();
        var utcDateTimeString = response.Substring(7, 17);
        var localDateTime = DateTime.ParseExact(utcDateTimeString, "yy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
        return localDateTime;
    }
} 
另外,我百度搜了一下 “C# 获取网络时间” 关键字,查到有很多获取百度网络时间的帖子,我试了一下,可以返回当前的时间,但不是很稳定,经常卡,如果你频繁的去请求,有时候还不返回数据,体验不是特别好,这里我就不贴代码了。
关于 Get Post 对应的用法,可以参考我的帖子
C# Http 请求接口 Get / Post 熊思宇的博客-CSDN博客
九、时间戳
时间戳是指表示特定时间点的数字值。它通常是从某个特定的起始时间(如1970年1月1日UTC)开始计算经过的秒数或毫秒数。
时间戳的用处:
1. 跨平台时间表示:时间戳是一种跨平台的时间表示方式,因为它是一个数字值,不受时区和格式的限制。可以将时间戳发送给其他系统或应用程序,并在不同的环境中进行解释和转换。
2. 时间计算和比较:通过使用时间戳,可以方便地进行时间计算和比较。可以将时间戳转换为日期时间对象,执行各种日期时间操作,如加减、比较和格式化。
3. 持久化存储:时间戳经常用于在数据库或日志文件中记录事件发生的时间。将时间戳存储为数字值比存储日期时间对象更高效,并且可以方便地进行排序和查询。
将时间转换为秒数,毫秒
代码:
namespace Test2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 将当前时间转换为时间戳(秒数)
            DateTimeOffset now = DateTimeOffset.Now;
            long timestampSeconds = now.ToUnixTimeSeconds();
            Console.WriteLine("timestampSeconds: {0}", timestampSeconds);
            // 将当前时间转换为时间戳(毫秒数)
            long timestampMilliseconds = now.ToUnixTimeMilliseconds();
            Console.WriteLine("timestampMilliseconds: {0}", timestampMilliseconds);
            Console.ReadKey();
        }
    }
} 
效果:

将时间戳转换为日期
代码:
namespace Test2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 将当前时间转换为时间戳(秒数)
            DateTimeOffset now = DateTimeOffset.Now;
            long timestampSeconds = now.ToUnixTimeSeconds();
            // 将当前时间转换为时间戳(毫秒数)
            long timestampMilliseconds = now.ToUnixTimeMilliseconds();
            // 将时间戳(秒数)转换回日期时间对象
            DateTimeOffset dateTimeFromSeconds = DateTimeOffset.FromUnixTimeSeconds(timestampSeconds);
            Console.WriteLine("dateTimeFromSeconds: {0}", dateTimeFromSeconds);
            // 将时间戳(毫秒数)转换回日期时间对象
            DateTimeOffset dateTimeFromMilliseconds = DateTimeOffset.FromUnixTimeMilliseconds(timestampMilliseconds);
            Console.WriteLine("dateTimeFromMilliseconds: {0}", dateTimeFromMilliseconds);
            Console.ReadKey();
        }
    }
} 
效果:

十、时区时间
现在有个问题,如果我在中国,想要知道美国现在是什么时间,要怎么计算呢?其实也不用计算,通过代码直接获取美国的现在时间就行了,也可以根据自己当前的时间,加上时间差,就可以计算美国的现在时间了。
例1:
使用时差多少来计算,美国时间比我们慢13个小时,得到本机的北京时间,然后减去13个小时,就是美国时间了
代码:
namespace Test2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            DateTime dt1 = DateTime.Now;
            DateTime dt2 = dt1.AddHours(-13);
            Console.WriteLine("美国时间是:{0}", dt2);
            Console.ReadKey();
        }
    }
} 
效果:

由于控制台时间没有更新,截图时耗了几秒,和网页上秒数差不了太多哈,哈哈。
例2:
获取美国时间
代码:
namespace Test2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 获取当前的本地时间
            DateTime localTime = DateTime.Now;
            // 将本地时间转换为美国东部时间
            TimeZoneInfo easternTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
            DateTime easternTime = TimeZoneInfo.ConvertTime(localTime, easternTimeZone);
            // 打印美国当前时间
            Console.WriteLine("美国当前时间:{0}", easternTime);
            Console.ReadKey();
        }
    }
} 
效果:

在上面的代码中,可以看到是使用这句代码获取到了美国时间
TimeZoneInfo easternTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
那么其他国家的时间要怎么获取呢?在 FindSystemTimeZoneById 方法内部的字符串 就是根据地区来获取时间的,如果你想获取其他国家或者地区的的时间,改这个字符串就好了。
例如:
获取到阿根廷现在的时间,阿根廷获取时间对应的字符是 Argentina Standard Time
代码:
namespace Test1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 获取当前的本地时间
            DateTime localTime = DateTime.Now;
            // 将本地时间转换为美国东部时间
            TimeZoneInfo easternTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Argentina Standard Time");
            DateTime easternTime = TimeZoneInfo.ConvertTime(localTime, easternTimeZone);
            // 打印美国当前时间
            Console.WriteLine("阿根廷当前时间:{0}", easternTime);
            Console.ReadKey();
        }
    }
} 
效果:

这个和网页上还是有一点时差的,我也不知道是什么原因,暂时就这样吧
时区对于的字符:
Dateline Standard Time - 国际日期变更线标准时间
 UTC-11 - UTC-11
 Samoa Standard Time - 萨摩亚群岛标准时间
 Hawaiian Standard Time - 夏威夷标准时间
 Alaskan Standard Time - 阿拉斯加标准时间
 Pacific Standard Time (Mexico) - 太平洋标准时间(墨西哥)
 Pacific Standard Time - 太平洋标准时间
 US Mountain Standard Time - 美国山地标准时间
 Mountain Standard Time (Mexico) - 山地标准时间(墨西哥)
 Mountain Standard Time - 山地标准时间
 Central America Standard Time - 中美洲标准时间
 Central Standard Time - 中部标准时间
 Central Standard Time (Mexico) - 中部标准时间(墨西哥)
 Canada Central Standard Time - 加拿大中部标准时间
 Eastern Standard Time - 东部标准时间
 US Eastern Standard Time - 美国东部标准时间
 SA Pacific Standard Time - 南美洲太平洋标准时间
 Venezuela Standard Time - 委内瑞拉标准时间
 SA Western Standard Time - 南美洲西部标准时间
 Paraguay Standard Time - 巴拉圭标准时间
 Pacific SA Standard Time - 太平洋南美洲标准时间
 Atlantic Standard Time - 大西洋标准时间
 Central Brazilian Standard Time - 巴西中部标准时间
 Newfoundland Standard Time - 纽芬兰标准时间
 SA Eastern Standard Time - 南美洲东部标准时间
 E. South America Standard Time - 东部南美洲标准时间
 Argentina Standard Time - 阿根廷标准时间
 Greenland Standard Time - 格陵兰标准时间
 Montevideo Standard Time - 蒙得维的亚标准时间
 Mid-Atlantic Standard Time - 中大西洋标准时间
 UTC-02 - UTC-02
 Azores Standard Time - 亚速尔群岛标准时间
 Cape Verde Standard Time - 佛得角群岛标准时间
 UTC - 协调世界时
 Morocco Standard Time - 摩洛哥标准时间
 Greenwich Standard Time - 格林威治标准时间
 GMT Standard Time - GMT 标准时间
 W. Central Africa Standard Time - 中非西部标准时间
 Romance Standard Time - 罗马标准时间
 Namibia Standard Time - 纳米比亚标准时间
 Central European Standard Time - 中欧的标准时间
 Central Europe Standard Time - 中欧标准时间
 W. Europe Standard Time - 西欧标准时间
 South Africa Standard Time - 南非标准时间
 Syria Standard Time - 叙利亚标准时间
 Jordan Standard Time - 约旦标准时间
 Egypt Standard Time - 埃及标准时间
 E. Europe Standard Time - 东欧标准时间
 Israel Standard Time - 耶路撒冷标准时间
 Middle East Standard Time - 中东标准时间
 FLE Standard Time - FLE 标准时间
 GTB Standard Time - GTB 标准时间
 E. Africa Standard Time - 东非标准时间
 Arabic Standard Time - 阿拉伯 (Arabic) 标准时间
 Arab Standard Time - 阿拉伯 (Arab) 标准时间
 Russian Standard Time - 俄罗斯标准时间
 Iran Standard Time - 伊朗标准时间
 Caucasus Standard Time - 高加索标准时间
 Azerbaijan Standard Time - 阿塞拜疆标准时间
 Georgian Standard Time - 格鲁吉亚标准时间
 Mauritius Standard Time - 毛里求斯标准时间
 Arabian Standard Time - 阿拉伯半岛标准时间
 Afghanistan Standard Time - 阿富汗标准时间
 Pakistan Standard Time - 巴基斯坦标准时间
 Ekaterinburg Standard Time - 叶卡捷琳堡标准时间
 West Asia Standard Time - 西亚标准时间
 Sri Lanka Standard Time - 斯里兰卡标准时间
 India Standard Time - 印度标准时间
 Nepal Standard Time - 尼泊尔标准时间
 N. Central Asia Standard Time - 中亚北部标准时间
 Bangladesh Standard Time - 孟加拉国标准时间
 Central Asia Standard Time - 中亚标准时间
 Myanmar Standard Time - 缅甸标准时间
 North Asia Standard Time - 北亚标准时间
 SE Asia Standard Time - 东南亚标准时间
 Ulaanbaatar Standard Time - 乌兰巴托标准时间
 North Asia East Standard Time - 北亚东部标准时间
 China Standard Time - 中国标准时间
 Taipei Standard Time - 台北标准时间
 Singapore Standard Time - 马来西亚半岛标准时间
 W. Australia Standard Time - 澳大利亚西部标准时间
 Tokyo Standard Time - 东京标准时间
 Yakutsk Standard Time - 雅库茨克标准时间
 Korea Standard Time - 韩国标准时间
 AUS Central Standard Time - 澳大利亚中部标准时间
 Cen. Australia Standard Time - 中部澳大利亚标准时间
 West Pacific Standard Time - 太平洋西部标准时间
 AUS Eastern Standard Time - 澳大利亚东部标准时间
 E. Australia Standard Time - 东部澳大利亚标准时间
 Vladivostok Standard Time - 符拉迪沃斯托克(海参崴)标准时间
 Tasmania Standard Time - 塔斯马尼亚岛标准时间
 Central Pacific Standard Time - 太平洋中部标准时间
 Magadan Standard Time - 马加丹标准时间
 UTC+12 - UTC+12
 New Zealand Standard Time - 新西兰标准时间
 Kamchatka Standard Time - 堪察加标准时间
 Fiji Standard Time - 斐济标准时间
 Tonga Standard Time - 汤加标准时间
结束
如果这个帖子对你有所帮助,欢迎 关注 + 点赞 + 留言
end



















