英文:
System.FormatException: String '638143033743100000' was not recognized as a valid DateTime
问题
错误:
System.FormatException: 字符串 '638143033743100000' 未被识别为有效的 DateTime
当前代码已经有允许两种不同日期格式的处理方式:
items = (await itemService.GetItems())
.GroupBy(x => x.ItemKey)
.Select(x => new DisplayItem
{
item = x.item,
country = x.FirstOrDefault(y => y.item == "Country")?.Value,
date = x.FirstOrDefault(y => y.item == "Date")?.Value != null
? DateTime.ParseExact(x.FirstOrDefault(y => y.item == "Date")?.Value,
new string[] {
"yyyy-MM-dd HH:mm:ss.FFFFFFF",
"dd.MM.yyyy HH:mm:ss"}, null, DateTimeStyles.AssumeLocal)
: (DateTime?)null
}).Where(s => s.country!= null).OrderByDescending(s => s.date).ToList();
我们已经添加了一个新的日期格式,现在使用的是时间戳。我能知道时间戳的格式吗?谢谢。
英文:
Error:
System.FormatException: String '638143033743100000' was not recognized as a valid DateTime
Current code already has provision to allow two different date format:
items = (await itemService.GetItems())
.GroupBy(x => x.ItemKey)
.Select(x => new DisplayItem
{
item = x.item,
country = x.FirstOrDefault(y => y.item == "Country")?.Value,
date = x.FirstOrDefault(y => y.item == "Date")?.Value != null
? DateTime.ParseExact(x.FirstOrDefault(y => y.item == "Date")?.Value,
new string[] {
"yyyy-MM-dd HH:mm:ss.FFFFFFF",
"dd.MM.yyyy HH:mm:ss"}, null, DateTimeStyles.AssumeLocal)
: (DateTime?)null
}).Where(s => s.country!= null).OrderByDescending(s => s.date).ToList();
We have added a new date format. Using time in ticks now. May I know the format for ticks. Thank you.
答案1
得分: 2
To convert from string
ticks to DateTime
, parse it as a long and use the following:
long ticks = 638143033743100000L;
DateTime dt = new DateTime(ticks);
And here is how you can use it in your code:
items = (await itemService.GetItems())
.GroupBy(x => x.ItemKey)
.Select(x => new DisplayItem
{
item = x.item,
country = x.FirstOrDefault(y => y.item == "Country")?.Value,
date = (x.FirstOrDefault(y => y.item == "Date") != null) && long.TryParse(x.FirstOrDefault(y => y.item == "Date").Value, out long l) && l > 0
? new DateTime(l) : (DateTime?)null
}).Where(s => s.country!= null).OrderByDescending(s => s.date).ToList();
You can then set the formatting on your property date
later down the line.
英文:
EDIT: Didn't see it was in ticks and not in UnixTime
To convert from string
ticks to DateTime
, parse it as a long and use the following
long ticks = 638143033743100000L;
DateTime dt = new(ticks);
Here is a working fiddle
And here is how you can use it in your code
items = (await itemService.GetItems())
.GroupBy(x => x.ItemKey)
.Select(x => new DisplayItem
{
item = x.item,
country = x.FirstOrDefault(y => y.item == "Country")?.Value,
date = (x.FirstOrDefault(y => y.item == "Date") != null) && long.TryParse(x.FirstOrDefault(y => y.item == "Date").Value, out long l) && l > 0
? new DateTime(l) : (DateTime?)null
}).Where(s => s.country!= null).OrderByDescending(s => s.date).ToList();
You can then set the formatting on your property date
later down the line.
Original answer:
Here is how to convert a Timestamp to a DateTime
First, convert your string to a long
If it is in seconds
DateTimeOffset.FromUnixTimeSeconds(long).UtcDateTime
If it is in milliseconds
DateTimeOffset.FromUnixTimeMilliseconds(l).UtcDateTime;
It if better to make an extension method
public static class NumericExtensions
{
public static DateTime ConvertFromTimestampSecondsToDateTime(this long l) => DateTimeOffset.FromUnixTimeSeconds(l).UtcDateTime;
public static DateTime ConvertFromTimestampMillisecondsToDateTime(this long l) => DateTimeOffset.FromUnixTimeMilliseconds(l).UtcDateTime;
}
Then use them like so
long timestamp = 638143033743100000l;
DateTime dt = timestamp.ConvertFromTimestampMillisecondsToDateTime();
答案2
得分: 2
Sure, here's the translated code portion:
创建一个新方法,而不是直接使用 ParseExact,然后调用该方法。这将使您的代码更加可读。在 LINQ 语句中处理空值情况会导致维护问题。
.Select(x => new DisplayItem
{
item = x.item,
country = x.FirstOrDefault(y => y.item == "Country")?.Value,
date = MyLovelyDateTimeParse(x.FirstOrDefault(y => y.item == "Date")?.Value),
// ...... 其他部分
})
public DateTime? MyLovelyDateTimeParse(string dateString)
{
if (String.IsNullOrEmpty(dateString))
return null;
else if (long.TryParse(dateString, out long value))
return new DateTime(value);
else
return DateTime.ParseExact(dateString,
new string[] {
"yyyy-MM-dd HH:mm:ss.FFFFFFF",
"dd.MM.yyyy HH:mm:ss"}, null, DateTimeStyles.AssumeLocal);
}
Please note that I have translated the code part only as per your request. If you have any further questions or need additional assistance, feel free to ask.
英文:
Create a new method and use that instead of ParseExact directly and call that instead. Should make your code even more readable. Your handling of null cases in the midth of the linq statement is a maintenance mess.
.Select(x => new DisplayItem
{
item = x.item,
country = x.FirstOrDefault(y => y.item == "Country")?.Value,
date = MyLovelyDateTimeParse(x.FirstOrDefault(y => y.item ==
"Date")?.Value),
...... etc.
})
public DateTime? MyLovelyDateTimeParse(string dateString)
{
if (String.IsNullOrEmpty(dateString))
return null;
else if (long.TryParse(dateString, out long value))
return new DateTime(value);
else
return DateTime.ParseExact(dateString,
new string[] {
"yyyy-MM-dd HH:mm:ss.FFFFFFF",
"dd.MM.yyyy HH:mm:ss"}, null, DateTimeStyles.AssumeLocal);
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论