Coldairarrow / EFCore.Sharding

Database Sharding For EFCore
Apache License 2.0
693 stars 143 forks source link

某些环境下ShardingContainer.SetDateSharding方法可能存在DateTime格式化问题 #136

Open pendingtask opened 1 year ago

pendingtask commented 1 year ago

ShardingContainer类中采用的日期格式化方式为斜杠分隔, 如"yyyy/MM/dd HH:mm:00"

public IShardingBuilder SetDateSharding<TEntity>(string shardingField, ExpandByDateMode expandByDateMode, params (DateTime startTime, DateTime endTime, string sourceName)[] ranges)
{
    //...
    (string conExpression, string startTimeFormat, Func<DateTime, DateTime> nextTime) paramter =
                    expandByDateMode switch
                    {
                        ExpandByDateMode.PerMinute => ("0 * * * * ? *", "yyyy/MM/dd HH:mm:00", x => x.AddMinutes(1)),
                        ExpandByDateMode.PerHour => ("0 0 * * * ? *", "yyyy/MM/dd HH:00:00", x => x.AddHours(1)),
                        ExpandByDateMode.PerDay => ("0 0 0 * * ? *", "yyyy/MM/dd 00:00:00", x => x.AddDays(1)),
                        ExpandByDateMode.PerMonth => ("0 0 0 1 * ? *", "yyyy/MM/01 00:00:00", x => x.AddMonths(1)),
                        ExpandByDateMode.PerYear => ("0 0 0 1 1 ? *", "yyyy/01/01 00:00:00", x => x.AddYears(1)),
                        _ => throw new Exception("expandByDateMode参数无效")
                    };

                //确保之前的表已存在
                var theTime = ranges.Min(x => x.startTime);
                theTime = DateTime.Parse(theTime.ToString(paramter.startTimeFormat));

    //...
}

可能在特定环境下在执行DateTime.Parse(theTime.ToString(paramter.startTimeFormat));时产生错误FormatException: String '2023年04年01 00:00:00' was not recognized as a valid DateTime., 如图: image 日期在按照""yyyy/MM/dd HH:mm:ss""格式化时未被格式化为"2023年05月01", 却变成了"2023年05年01", "/"均被替换成了"年". 使用环境为 .NET 6, WIN10专业版中文环境(非常常见的环境), 未发现特殊影响因素.
测试发现可能是VS或电脑本身因素导致本问题, 如统一采用横杠等格式可以避免此类问题带来的影响, 如"yyyy-MM-dd HH:mm:ss". image