C# 时间计算(二)

目录

五、时间比较

六、时间数据转换

七、时间间隔计算

八、获取网络时间

九、时间戳

十、时区时间

结束


概述
在 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

猜你喜欢

转载自blog.csdn.net/qq_38693757/article/details/134602108