C#中DateTime的Month属性只读无法赋值 解析欧盟格式日期计算间隔天数
问题原因
.NET 中的 DateTime 是不可变值类型,实例创建完成后,Year、Month、Day 等属性均为只读,无法直接修改。如果需要调整日期字段,必须基于现有值和新的字段参数,创建全新的 DateTime 实例。
另外你现有代码里存在一个逻辑错误:欧盟日期格式为「日/月/年」,按分隔符拆分后,索引为1的元素才是月份字段,你原代码中判断input[2]为月份的逻辑不符合输入格式规则。
实现步骤
- 先处理月份转换逻辑:兼容数字月份和英文月份名称两种输入,统一转换为int类型的月份数值
- 拆分输入后分别把日、月、年三个字段转换为合法的数值
- 用转换完成的三个数值创建新的
DateTime实例,替代原来的旧实例即可
完整可运行代码示例
using System; using System.Globalization; namespace ConsoleApp1 { class Program { static void Main(string[] args) { // 读取两个日期输入 string[] inputDate1 = Console.ReadLine().Split(' ', '/'); string[] inputDate2 = Console.ReadLine().Split(' ', '/'); // 处理第一个日期 DateTime date1 = ParseEuDate(inputDate1); // 处理第二个日期 DateTime date2 = ParseEuDate(inputDate2); // 计算间隔天数示例 TimeSpan diff = date2 - date1; Console.WriteLine($"两个日期的间隔天数为:{Math.Abs(diff.TotalDays)}"); Console.WriteLine("\n输入的第一个日期拆分结果:"); foreach (var item in inputDate1) { Console.Write(item + " "); } } /// <summary> /// 解析欧盟格式(日/月/年)的日期拆分结果,返回DateTime实例 /// </summary> private static DateTime ParseEuDate(string[] dateParts) { if (dateParts.Length != 3) { throw new ArgumentException("日期格式不合法,请按照 日/月/年 格式输入"); } // 转换日 int day = int.Parse(dateParts[0]); // 转换月:兼容数字和英文两种格式 int month; string monthInput = dateParts[1].Trim().ToLower(); if (!int.TryParse(monthInput, out month)) { // 英文月份转数字,使用英文文化信息 month = DateTime.ParseExact(monthInput, "MMMM", CultureInfo.GetCultureInfo("en-GB")).Month; } // 转换年 int year = int.Parse(dateParts[2]); // 返回新的DateTime实例 return new DateTime(year, month, day); } } }
注意事项
- 如果需要保留原有
DateTime实例的时分秒信息,可以创建新实例时传入旧实例的时分秒参数:return new DateTime(year, month, day, oldDate.Hour, oldDate.Minute, oldDate.Second); - 代码中使用了英文英国文化信息
en-GB匹配月份名称,符合欧盟日期输入的场景 - 可以根据需要添加输入合法性校验,避免用户输入非法值导致程序报错
内容的提问来源于stack exchange,提问作者Mical -
相关产品推荐
相关产品推荐

