目录
五、时间比较
六、时间数据转换
七、时间间隔计算
八、获取网络时间
九、时间戳
十、时区时间
结束
概述
在 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