Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSON.NET:String';20年7月1日14:15';未识别为有效的日期时间_C#_Datetime_Json.net_2 Digit Year_Y2k - Fatal编程技术网

C# JSON.NET:String';20年7月1日14:15';未识别为有效的日期时间

C# JSON.NET:String';20年7月1日14:15';未识别为有效的日期时间,c#,datetime,json.net,2-digit-year,y2k,C#,Datetime,Json.net,2 Digit Year,Y2k,我无法使用EPPlus从Excel反序列化日期时间字符串。我已经阅读了关于此问题的其他答案,但仍然无法解决此问题,并得到错误:字符串'M-d-yy hh:mm'未被识别为有效的日期时间 根据在这个主题上找到的其他答案,我已经将DateTimeFormat更改为“M/d/yy hh:mm”,这是我在EPPlus上放手表时返回的字符串。我目前的文化是“en UK”,但我使用的是不变量文化,因为EPPlus推出了我更愿意使用的上述格式。如果这是一个问题,那么我不介意更改它,但我不认为从美国格式更改为英

我无法使用EPPlus从Excel反序列化日期时间字符串。我已经阅读了关于此问题的其他答案,但仍然无法解决此问题,并得到错误:字符串'M-d-yy hh:mm'未被识别为有效的日期时间

根据在这个主题上找到的其他答案,我已经将DateTimeFormat更改为“M/d/yy hh:mm”,这是我在EPPlus上放手表时返回的字符串。我目前的文化是“en UK”,但我使用的是不变量文化,因为EPPlus推出了我更愿意使用的上述格式。如果这是一个问题,那么我不介意更改它,但我不认为从美国格式更改为英国格式有什么意义,只是因为它在DB中再次更改为国际ISO格式

它一定仍然认为它遵循了英国的datetime格式,但我看不出哪里出了问题。任何帮助都将不胜感激!谢谢

以下是我目前的情况:

                var dateTimeConverter = new IsoDateTimeConverter
                {
                    Culture = CultureInfo.InvariantCulture,
                    DateTimeFormat = "M/d/yy h:mm",
                    DateTimeStyles = DateTimeStyles.AssumeLocal
                };

                var excelImportResponse = new ExcelImportResponse<T>();
                foreach (DataRow row in dataTable.AsEnumerable())
                {
                    excelImportResponse.Objects.Add(
                        JsonConvert.DeserializeObject<T>(
                            new JObject(
                                row.Table.Columns
                                    .Cast<DataColumn>()
                                    .Select(c => new JProperty(c.ColumnName.Trim(), JToken.FromObject(row[c])))
                                )
                                .ToString(Formatting.None),
                                new JsonSerializerSettings
                                {
                                    Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
                                    {
                                        excelImportResponse.Errors.Add(args.ErrorContext.Error.Message);
                                        args.ErrorContext.Handled = true;
                                    },
                                    Converters = { dateTimeConverter }
                                })
                        );
                }
var dateTimeConverter=新的IsoDateTimeConverter
{
Culture=CultureInfo.InvariantCulture,
DateTimeFormat=“M/d/yy h:mm”,
DateTimeStyles=DateTimeStyles.AssumeLocal
};
var excelImportResponse=新的excelImportResponse();
foreach(dataTable.AsEnumerable()中的DataRow行)
{
excelImportResponse.Objects.Add(
JsonConvert.DeserializeObject(
新作业项目(
row.Table.Columns
.Cast()
.Select(c=>newjproperty(c.ColumnName.Trim(),JToken.FromObject(行[c]))
)
.ToString(格式化为.None),
新JsonSerializerSettings
{
Error=委托(对象发送方,Newtonsoft.Json.Serialization.ErrorEventArgs args args)
{
excelImportResponse.Errors.Add(args.ErrorContext.Error.Message);
args.ErrorContext.Handled=true;
},
转换器={dateTimeConverter}
})
);
}

错误: 字符串“7/1/20 14:15”未被识别为有效的日期时间

完全例外 在System.DateTimeParse.ParseExact(ReadOnlySpan
1s,ReadOnlySpan
1格式,DateTimeFormatInfo dtfi,DateTimeStyles样式) 在System.DateTime.ParseExact(字符串s、字符串格式、IFormatProvider提供程序、DateTimeStyles样式) 位于Newtonsoft.Json.Converters.IsoDateTimeConverter.ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序) 位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter转换器、JsonReader读取器、类型objectType、对象existingValue) 位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty属性、JsonConverter属性转换程序、JsonContainerContract容器合同、JsonProperty容器属性、JsonReader阅读器、对象目标) 位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(对象newObject、JsonReader、JSONObject合同、JsonProperty成员、字符串id)

使用此转换器

var dateTimeConverter = new IsoDateTimeConverter
{
    Culture = CultureInfo.InvariantCulture,
    //note the "H" which accepts 24-hour format, whereas "h" only accepts 12-hour format and will fail for a time like "14:25"
    DateTimeFormat = "M/d/yy H:mm",  
    DateTimeStyles = DateTimeStyles.AssumeLocal
};
如果我这样做,效果很好

class AType {
    public DateTime aDate {get;set;}
}

...

var sett = new JsonSerializerSettings { Converters = new List<JsonConverter>{ dateTimeConverter}};
var d1 = new AType{ aDate = DateTime.Now};

var s = JsonConvert.SerializeObject(d1, sett);
var d2 = JsonConvert.DeserializeObject<AType>(s, sett);
产生,因为这就是进入转换器的东西。如果这种格式有点不正确,转换器可能会抛出您看到的错误

此外,我不知道你的项目的目的或背景。但是,强烈反对在年度中只使用两位数。如果您确实知道自己在做什么,并且在2000年1月1日之前或2099年12月31日之后,您永远不会有任何日期,您可以这样做。但是,是的,我们曾经去过那里(70年代没有人想到他们的系统在2000年仍在运行),一些系统可能会在19/1/38 3:14再次使用此转换器

var dateTimeConverter = new IsoDateTimeConverter
{
    Culture = CultureInfo.InvariantCulture,
    //note the "H" which accepts 24-hour format, whereas "h" only accepts 12-hour format and will fail for a time like "14:25"
    DateTimeFormat = "M/d/yy H:mm",  
    DateTimeStyles = DateTimeStyles.AssumeLocal
};
如果我这样做,效果很好

class AType {
    public DateTime aDate {get;set;}
}

...

var sett = new JsonSerializerSettings { Converters = new List<JsonConverter>{ dateTimeConverter}};
var d1 = new AType{ aDate = DateTime.Now};

var s = JsonConvert.SerializeObject(d1, sett);
var d2 = JsonConvert.DeserializeObject<AType>(s, sett);
产生,因为这就是进入转换器的东西。如果这种格式有点不正确,转换器可能会抛出您看到的错误


此外,我不知道你的项目的目的或背景。但是,强烈反对在年度中只使用两位数。如果您确实知道自己在做什么,并且在2000年1月1日之前或2099年12月31日之后,您永远不会有任何日期,您可以这样做。但是,是的,我们曾经去过那里(70年代没有人想到他们的系统在2000年仍在运行),有些系统可能会在38年1月19日3:14再次出现,评论不供讨论;此对话已结束。评论不用于扩展讨论;这段对话已经结束。没有办法避免两位数年份的问题。今年,因为
20
被解读为1920年——劳埃德、哈利法克斯和苏格兰银行。在JSON中使用非标准日期格式是一个非常糟糕的开始with@PanagiotisKanavos关于y2k,你是对的,OP已经多次被警告过了。但归根结底,这是他的决定,他如何处理警告。OP所看到的错误与y2k无关,但自定义日期时间转换器不接受24小时格式。无法避免2位数年份的问题。今年,因为
20
被解读为1920年——劳埃德、哈利法克斯和苏格兰银行。在JSON中使用非标准日期格式是一个非常糟糕的开始with@PanagiotisKanavos关于y2k,你是对的,OP已经多次被警告过了。但归根结底,这是他的决定,他如何处理警告。OP看到的错误与y2k无关,而是与自定义日期有关