C# 如何将BigQuery时间戳转换为DateTime?

C# 如何将BigQuery时间戳转换为DateTime?,c#,google-bigquery,C#,Google Bigquery,我正在使用Google.Cloud.BigQuery.V2访问大查询。在我的表格中,我创建了一个字段,其时间戳为(例如:2019-08-11 11:22:22.123 UTC)。当我试图将此字段转换为C#datetime时,它会给出以下输出: 8/11/2019 11:22:22 PM 当我试图将其转换为日期时间(格式:yyyy-MM-dd-HH:MM:ss.fffffff)时,它给出了以下值 2019-08-11 22:22:22.0000000 但是我希望我的输出像这样2019-08-1

我正在使用Google.Cloud.BigQuery.V2访问大查询。在我的表格中,我创建了一个字段,其时间戳为(例如:2019-08-11 11:22:22.123 UTC)。当我试图将此字段转换为C#datetime时,它会给出以下输出:

8/11/2019 11:22:22 PM
当我试图将其转换为日期时间(格式:yyyy-MM-dd-HH:MM:ss.fffffff)时,它给出了以下值

2019-08-11 22:22:22.0000000
但是我希望我的输出像这样
2019-08-11 11:22:22.1230000

这是我的密码

string created_at = $"{row["created_at"]}".ToString() == null ? "" : $"{row["created_at"]}".ToString();

DateTime date = DateTime.ParseExact(created_at, "M/d/yyyy H:mm:ss tt", CultureInfo.InvariantCulture);

string newDate = date.ToString("yyyy-MM-dd HH:mm:ss.fffffff");

Console.WriteLine (newDate);
我做错了什么?如何获取毫秒数?

您应该使用此选项

string newDate = date.ToString("yyyy-MM-dd hh:mm:ss.fffffff");
有关格式说明符的详细信息

var date=(DateTime?)row["created_at"];
var text=string.Format("{0:yyyy-MM-dd hh:mm:ss.fffffff tt}", date, 
                       CultureInfo.InvariantCulture);

读取
BigQueryDbType.Timestamp
值,并使用12小时符号和英语AM/PM指示符将其格式化为字符串

解释

显示调用
行[“created_at”]
将转换类型。这意味着此代码将在以下情况下工作:

var date=(DateTime?)row["created_at"];
返回的日期包含所有信息。如果该值包含毫秒,
date
也将包含毫秒。源代码显示该值的精度为10微秒

DateTime是一个二进制值,它没有格式。仅当需要将字符串解析为日期时间值时,或当需要将日期时间值格式化为字符串以显示或保存到文本文件时,使用
ToString()
string.Format()
或字符串插值,格式才适用

例如,
o
创建ISO8601格式的字符串:

var date=DateTime.UtcNow.ToString("o")
//2019-09-18T14:02:22.2048166Z
是两位数说明符,返回24小时值(0-23),而
hh
返回0到12之间的小时。当使用
hh
时,还应使用
t
(AM/PM指示符),否则无法确定时间是上午10点还是晚上10点

14:00等时间返回:

DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fffffff")
//2019-09-18 14:07:48.2517651
当它回来的时候

DateTime.UtcNow.ToString("yyyy-MM-dd hh:mm:ss.fffffff")
//2019-09-18 02:08:45.1001800
哪一个是问题-这是上午还是下午?在末尾添加
tt
可以解决这个问题,但是返回的指示符将被本地化。为了确保使用特定的指示符,我们需要传递CultureInfo参数:

DateTime.UtcNow.ToString("yyyy-MM-dd hh:mm:ss.fffffff tt",CultureInfo.InvariantCulture)
//2019-09-18 02:10:39.9194735 PM
综合起来,从BigQuery获取日期,然后使用AM/PM将其格式化为字符串:

var date=(DateTime?)row["created_at"];
var text=string.Format("{0:yyyy-MM-dd hh:mm:ss.fffffff tt}",date,CultureInfo.InvariantCulture);
使用字符串插值的等效值为:

var text=FormattableString.Invariant($"{date:yyyy-MM-dd hh:mm:ss.fffffff tt}");

DateTime没有格式,它是一个二进制值。仅当创建用于显示的字符串时,格式才适用。
行[“created_at”]
的实际内容是什么?它可能已经是一个不需要任何其他转换的
DateTime
$“{row[”created_at“]}”。ToString()
将永远不会为空,因为即使
row[”created_at“]
为空,插入的字符串也会将空值格式化为空字符串。对
字符串
调用
ToString
也是毫无意义的。顺便说一句
$“{row[”created_at“]}”。ToString()==null
是毫无意义的,并且总是false
$“{row[”created_at“]}
已经创建了一个字符串。如果该列包含一个字符串,则该操作除了返回该字符串之外什么也不做。如果是日期时间,则它使用您帐户的区域设置创建了一个字符串。调用
ToString()
在它上面不会有任何作用。将该字符串与
null
进行比较总是会出错将
row[“created_at”]
存储在某个地方并检查它,例如
var created=row[“created_at”];
。它的类型是什么?它是字符串吗?a
DateTime
?创建了什么。GetType()
return?如果尝试
DateTime?date=(DateTime?)行[“created_at”]
?如果这样做有效,则表示您已经有了日期时间。除非
BigQuery
返回日期时间或美国日期字符串而不是
2019-08-11 11:22:22.123 UTC
,否则此问题中的字符串不会出现。OP询问如何将某些内容转换为日期时间。Th最有可能已经是一个日期时间了,但是OP的代码在试图解析它之前将它转换成不同地区的字符串。我认为我们在这里做得太过了。我在最后一行看到了问题,我们如何将这个日期格式化成我想要的格式?…这就是我试图回答的…这不是问题。还有日期时间没有格式。只有字符串doAgain..问题的标题与描述中的问题不匹配..但让我们不要争论它…我的情况到此为止☺@PanagiotisKanavos我怎样才能得到毫秒?
var text=FormattableString.Invariant($"{date:yyyy-MM-dd hh:mm:ss.fffffff tt}");