广州市研发网站建设平台,上海城隍庙属于哪个区,怎么做网站360图片链接,最近国际新闻热点DateTime#xff0c;就是一个世界的大融合。日期和时间#xff0c;在我们开发中非常重要。DateTime在C#中#xff0c;专门用来表达和处理日期和时间。本文算是多年使用DateTime的一个总结#xff0c;包括DateTime对象的整体应用#xff0c;以及如何处理不同的区域、时区、… DateTime就是一个世界的大融合。日期和时间在我们开发中非常重要。DateTime在C#中专门用来表达和处理日期和时间。本文算是多年使用DateTime的一个总结包括DateTime对象的整体应用以及如何处理不同的区域、时区、格式等内容。一、什么是DateTime跟我们想的不一样DateTime不是一个类(class)而是一个结构(struct)它存在于System命名空间下在Dotnet Core中处于System.Runtime.dll中。看一下DateTime的定义public struct DateTime : IComparable, IComparable, IConvertible, IEquatable, IFormattable, System.Runtime.Serialization.ISerializable从定义可以知道DateTime实现了IComparable、IConvertible、IEquatable、IFormattable、ISerializable。因此DateTime可以让我们使用有关日期和时间的很多相关信息。二、构造初始化一个DateTime对象C#提供了11种方式进行初始化根据需要可以使用年月日时分秒以及Ticks。Ticks是C#里一个独特的定义它是以公历0001年1月1日00:00:00.000以来所经历的以100纳秒为间隔的间隔数。我们知道纳秒、微秒、毫秒和秒之间都是1000倍的关系所以1毫秒等于10000Ticks。这个数字很重要。在C#到Javascript时间转换时需要很清楚这个对应关系。DateTime date1 new DateTime(2020, 7, 14);DateTime date2 new DateTime(2020, 7, 14, 14, 23, 40);DateTime date3 new DateTime(637303334200000000);三、静态字段DateTime包括三个静态字段MinValue - DateTime的最小值对应公历0001年1月1日00:00:00.000Ticks为0MaxValue - DateTime的最大值对应公历9999看12月31日23:59:59.999Ticks为3155378975999999999UnixEpoch - Unix、Javascript下的时间起点对应公历1970年1月1日00:00:00.000Ticks为621355968000000000在Javascript中时间保存的是从UnixEpoch开始即从1970年1月1日00:00:00.000开始到现在的毫秒数。所以C#时间到Javascript时间的转换可以用以下代码public static long ToUnixTicks(this DateTime time){ return (long)TimeSpan.FromTicks(time.Ticks - DateTime.UnixEpoch.Ticks).TotalMilliseconds - TimeZoneInfo.Local.GetUtcOffset(time).Hours * 60 * 60 * 1000;}在Javascript中引入时间var time new Date().setTime(unix_ticks);就完成了转换。四、方法DateTime提供了很多种方法来操作DateTime对象用于处理诸如向日期添加天数、小时、分钟、秒、日期差异、从字符串解析到datetime对象、获得通用时间等等。这儿就不详细说了需要了可以查微软文档很详细。给几个例子TimeSpan duration new System.TimeSpan(30, 0, 0, 0);DateTime newDate1 DateTime.Now.Add(duration);DateTime today DateTime.Now;DateTime newDate2 today.AddDays(30);string dateString 2020-07-14 14:23:40;DateTime dateTime12 DateTime.Parse(dateString);DateTime date1 new System.DateTime(2020, 7, 13, 14, 20, 10);DateTime date2 new System.DateTime(2020, 7, 14, 14, 25, 40);DateTime date3 new System.DateTime(2020, 7, 14, 14, 25, 40);TimeSpan diff1 date2.Subtract(date1);DateTime date4 date3.Subtract(diff1);TimeSpan diff2 date3 - date2;DateTime date5 date2 - diff1;五、属性DateTime提供了年月日时分秒、以及其它一些属性用来方便提取日期中的细节。DateTime myDate new DateTime(2020, 7, 14, 14, 23, 40);int year myDate.Year; int month myDate.Month;int day myDate.Day;int hour myDate.Hour;int minute myDate.Minute;int second myDate.Second;int weekDay (int)myDate.DayOfWeek;string weekString myDate.DayOfWeek.ToString();其中DayOfWeek是用来判断日期是星期几的它是一个枚举值。注意按照惯例一周是从周日开始的所以0表示周日6表示周六。DateTimeKind用来定义实例表示的时间是基于本地时间(LocalTime)、UTC时间(UTC)或是不指定(Unspecified)。在大多数情况下我们定义时间就直接定义年月日时分秒例如下面DateTime myDate new DateTime(2020, 7, 14, 14, 23, 40);这种定义下这个时间就是Unspecified的。在使用时如果应用过程中不做时间转换始终以这种方式用那不会有任何问题。但在某些情况下时间有可能会发生转换例如跨国应用的时间处理再例如MongoDB在数据库保存数据时强制使用UTC时间。这种情况下处理时间就必须采用LocalTime或UTC时间DateTime myDate new DateTime(2020, 7, 14, 14, 23, 40, DateTimeKind.Local);或DateTime myDate new DateTime(2020, 7, 14, 14, 23, 40, DateTimeKind.Unspecified);否则在时间类型不确定的情况下时间转换会出现问题。看看下面的例子DateTime myDate new DateTime(2020, 7, 14, 14, 23, 40);var date1 myDate.ToLocalTime();Console.WriteLine(date1.ToString());/* 7/14/2020 22:23:40 PM */var date2 myDate.ToUniversalTime();Console.WriteLine(date2.ToString());/* 7/14/2020 6:23:40 AM */当使用ToLocalTime方法时Unspecified时间会认为自己是UTC时间而当使用ToUniversalTime时Unspecified时间又会认为自己是LocalTime时间导致时间上的转换错误。关于MongoDB处理时间的相关内容可以去看我的另一个文章MongoDB via Dotnet Core数据映射详解六、时间对象的加减及比较DateTime时间对象的加减及比较非常方便。看例子DateTime date1 new System.DateTime(2020, 7, 14);TimeSpan timeSpan new System.TimeSpan(10, 5, 5, 1);DateTime addResult date1 timeSpan;DateTime substarctResult date1 - timeSpan; DateTime date2 new DateTime(2020, 7, 14);DateTime date3 new DateTime(2020, 7, 15);bool isEqual date2 date3;七、日期的格式化日期的格式化是相关DateTime网上询问和查找最多的内容。有这么一个表对照这个表就可以date.ToString(yyyy-MM-dd HH:mm:ss);八、阴历DateTime本身依赖于日历Calendar类。Calendar是一个抽象类在System.Globalization命名空间下也在System.Runtime.dll中。而在Calendar类下面提供了很多不同类型的日历。跟我们有关系的是中国的阴历ChineseLunisolarCalendar。使用也很简单Calendar calendar new ChineseLunisolarCalendar();DateTime date new DateTime(2020, 06, 24, calendar);/* 7/14/2020 00:00:00 AM */嗯嗯经常看阴历的伙伴们会看出一点问题今天是阴历5月24为什么这儿写的是6月24呢这个是因为今天闰4月所以阴历5月实际是这一个阴历年的第6个月。那如何判断哪个月是否闰月呢Calendar calendar new ChineseLunisolarCalendar();bool is_leapYear calendar.IsLeapYear(2020);bool is_leapMonth calendar.IsLeapMonth(2020, 5);bool is_leapDay calendar.IsLeapDay(2020, 5, 26);同样我们也可以用公历转阴历DateTime date DateTime.Now;Calendar calendar new ChineseLunisolarCalendar();int year calendar.GetYear(date);/* 2020 */int month calendar.GetMonth(date);/* 6 */int day calendar.GetDayOfMonth(date);/* 24 */以上就是全部内容了。有没有发现微软实现的功能比我们想像的要多(全文完)喜欢就来个三连让更多人因你而受益