- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
在.Net Framework中,我们常用的时间类型是DateTime。直到.Net6微软加入了两个新的时间类型:DateOnly和TimeOnly,才弥补了之前的不足。
DateOnly :表示仅日期。比如:某人的生日,我只关心日期,就适合用DateOnly.
TimeOnly :表示仅时间。比如:每天定时执行某个任务,我只关心时间,就适合用TimeOnly.
由此可见,DateOnly和TimeOnly都有相应的应用场景。可小编在实际项目中遇到了这样的业务场景:需要每月给客户生成月账单。这里我所关心的是某个月份,于是我首先想到用DateOnly表示( 不考虑字符串 ).
var date = new DateOnly( 2023 , 2 , 1 ); // 代表2023年2月1日
虽然DateOnly可用,但从字面理解和表现形式上还是略显尴尬。 DateOnly真正表达的是某一天并不是某个月, 在代码层面也容易混淆,所以并不符合小编的心理期望。经过一番纠结和思考,小编决定自己动手创建一个表示年/月的时间类型: YearMonth.
var ym = new YearMonth( 2023 , 2 ); // 代表2023年2月
YearMonth 的源码如下:
1 /// <summary> 2 /// 表示年/月的时间类型 3 /// </summary> 4 [JsonConverter( typeof (YearMonthJsonConverter))] 5 public readonly struct YearMonth 6 { 7 public int Year { get ; } 8 9 public int Month { get ; } 10 11 public YearMonth( int year, int month) 12 { 13 Year = year; 14 Month = month; 15 } 16 17 public YearMonth AddMonths( int value) 18 { 19 var date = new DateOnly(Year, Month, 1 ); 20 return FromDateOnly(date.AddMonths(value)); 21 } 22 24 public YearMonth AddYears( int value) 25 { 26 var date = new DateOnly(Year, Month, 1 ); 27 return FromDateOnly(date.AddYears(value)); 28 } 29 30 public DateOnly FirstDay() 31 { 32 return new DateOnly(Year, Month, 1 ); 33 } 34 35 public DateOnly LastDay() 36 { 37 var nextMonth = AddMonths( 1 ); 38 var date = new DateOnly(nextMonth.Year, nextMonth.Month, 1 ); 39 return date.AddDays(- 1 ); 40 } 41 42 public int DaysInMonth() 43 { 44 return DateTime.DaysInMonth(Year, Month); 45 } 46 47 public static YearMonth Current 48 { 49 get { return FromDateTime(DateTime.Now); } 50 } 51 52 public static YearMonth UtcCurrent 53 { 54 get { return FromDateTime(DateTime.UtcNow); } 55 } 56 57 public static YearMonth FromDateOnly(DateOnly dateOnly) 58 { 59 return new YearMonth(dateOnly.Year, dateOnly.Month); 60 } 61 62 public static YearMonth FromDateTime(DateTime dateTime) 63 { 64 return new YearMonth(dateTime.Year, dateTime.Month); 65 } 66 67 public static YearMonth FromString( string s) 68 { 69 if (DateTime.TryParse(s, out var date)) 70 { 71 return FromDateTime(date); 72 } 73 throw new ArgumentException( " format is error " , nameof(s)); 74 } 75 76 public override string ToString() 77 { 78 return $ " {Year.ToString().PadLeft(4, '0')}-{Month.ToString().PadLeft(2, '0')} " ; 79 } 80 81 public static bool operator == (YearMonth left, YearMonth right) 82 { 83 return left.Year == right.Year && left.Month == right.Month; 84 } 85 86 public static bool operator != (YearMonth left, YearMonth right) 87 { 88 return !(left.Year == right.Year && left.Month == right.Month); 89 } 90 91 public static bool operator >= (YearMonth left, YearMonth right) 92 { 93 return (left.Year > right.Year) || (left.Year == right.Year && left.Month >= right.Month); 94 } 95 96 public static bool operator <= (YearMonth left, YearMonth right) 97 { 98 return (left.Year < right.Year) || (left.Year == right.Year && left.Month <= right.Month); 99 } 100 101 public static bool operator > (YearMonth left, YearMonth right) 102 { 103 return (left.Year > right.Year) || (left.Year == right.Year && left.Month > right.Month); 104 } 105 106 public static bool operator < (YearMonth left, YearMonth right) 107 { 108 return (left.Year < right.Year) || (left.Year == right.Year && left.Month < right.Month); 109 } 110 111 public override bool Equals( object obj) 112 { 113 return base .Equals(obj); 114 } 115 116 public override int GetHashCode() 117 { 118 return base .GetHashCode(); 119 } 120 }
其中特性 [ JsonConverter(typeof( YearMonthJsonConverter )) ]用于Json序列化和反序列化.
1 public class YearMonthJsonConverter : JsonConverter<YearMonth> 2 { 3 public override YearMonth Read( ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) 4 { 5 return YearMonth.FromString(reader.GetString()); 6 } 7 8 public override void Write(Utf8JsonWriter writer, YearMonth value, JsonSerializerOptions options) 9 { 10 writer.WriteStringValue(value.ToString()); 11 } 12 }
YearMonth 的一些用法示例:
1 var ym = new YearMonth( 2023 , 2 ); 2 int n = ym.DaysInMonth(); // n:28 3 DateOnly d1 = ym.FirstDay(); // d1:2023/2/1 4 DateOnly d2 = ym.LastDay(); // d2:2023/2/28 5 string str = ym.ToString(); // str:2023-02 6 YearMonth ym2 = ym.AddMonths( 1 ); // ym2: 2023-03 7 YearMonth ym3 = YearMonth.FromDateOnly( new DateOnly( 2023 , 2 , 8 )); // ym3: 2023-02 8 YearMonth ym4 = YearMonth.FromDateTime( new DateTime( 2023 , 2 , 8 , 12 , 23 , 45 )); // ym4: 2023-02 9 bool b = new YearMonth( 2023 , 3 ) > new YearMonth( 2023 , 2 ); // b: true
至此,上面的 YearMonth 时间类型已经满足小编的开发需要,当然也可以根据需求继续扩展其它功能.
。
。
本文已同步至作者的微信公众号:玩转DotNet 。
感谢点赞并关注 。
最后此篇关于给C#新增一个时间类型:YearMonth的文章就讲到这里了,如果你想了解更多关于给C#新增一个时间类型:YearMonth的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
1. 新增用户 复制代码代码如下: mysql>insert into mysql.user(Host,User,Password) values(&quo
本文实例讲述了PHP操作redis实现的分页列表,新增,删除功能封装类与用法。分享给大家供大家参考,具体如下: <?php/* * redis 分页数据类库 */class redisP
在我的场景中,我必须使用类来添加 div ,这可以使用 onClick 函数轻松解决,但我需要它来完成我的任务,.click(function() 不适用于新元素,javascript/jquery
本文主要介绍了vue+elementui通用弹窗的实现(新增+编辑),分享给大家,具体如下: 组件模板 ?
例如: 修改(列名前 要有column关键字) ALTER TABLE [USER] ALTER column [
复制代码 代码如下: //连接localhost:27017 $conn = new Mongo(); //连接远程主机默认端口 $conn = new Mong
我正在关注这个guideline对于 Maven 插件,我添加了以下内容: org.apache.maven.plugins maven-release-plugin 2.5.3 ma
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
在新的 Lucene 4.4.0 版本中,近实时管理器 (org.apache.lucene.search.NRTManage) 已被 ControlledRealTimeReopenThread 取
抱歉,我现在正在编程中,但是我正在学习中,请帮助我。我被困在这个问题上。这是我的第一个应用程序,在likke帮助下需要完成所有工作。 我收到此错误:类型'_InternalLinkedHashMap'
从下图中我们可以看出,使用 XCode 11 构建的 iOS 13 的新呈现样式使导航栏的高度(56 高)与“全屏”呈现的导航栏(44 高)不同。 这里的问题是我的应用程序使用的是自定义的书面导航栏,
在 EGit 2.3 中,他们根据他们的发布文档添加了非快进 merge 功能 "Support git merge --no-ff as an EGit preference." http://wi
IntelliJ IDEA 2020.3.3的新错误修复程序已发布!您可以使用工具箱应用程序从IDE内部更新到新版本,也可以点击下方链接下载。 idea激活码 下载IntelliJ IDEA 2
据小米手环官微消息,小米手环 5 固件版本更新至 1.0.2.46 版本,另外小米运动 APP 也更新至了 4.8.0 版本。 此次更新使得小米手环 5 实现了 24 小时睡眠监测,对于上夜班
我在最新的 IntelliJ Idea 中得到以下提示: Not registered via @EnableConfigurationProperties or marked as Spring c
我有一个 UserModel,用于生产。我想添加一个 bool 属性(isRegistered)。对于已经在我的平台上的人们,我希望这个新属性是真实的。对于新用户,我希望它默认为 false。 如何将
CSS 1、CSS 2、CSS 2.1 和 CSS 3:每个版本的哪些 CSS 属性和选择器不同?我在谷歌上搜索了很多,但没有找到任何列表? 我需要每个版本所支持的属性和选择器的列表,但有差异。 最佳
为什么? Web 应用程序(.NET Framework)和核心 Web 应用程序(.NET Core)都面向 AnyCPU 平台。 这是一个错误还是这样做有什么值(value)? 我在 Window
我是一名优秀的程序员,十分优秀!