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

时间:2019-09-18 13:12:34

标签: c# google-bigquery

我正在使用Google.Cloud.BigQuery.V2访问大型查询。在我的表中,我在Timestamp中有一个字段created_at(例如:UTC 2019-08-11 11:22:22.123)。当我尝试将此字段转换为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);

我在这里做错了什么?如何获得毫秒?

2 个答案:

答案 0 :(得分:1)

您应该使用此

_doc

有关格式说明符here的更多信息

答案 1 :(得分:1)

使用

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

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

要读取BigQueryDbType.Timestamp值并将其使用12小时表示法和AM / PM英文指示符将其格式化为字符串。

说明

source code itself显示,调用row["created_at"]转换为BigQueryDbType.Timestamp类型将转换为to a UTC DateTime。这意味着此代码将起作用:

var date=(DateTime?)row["created_at"];

返回的日期包含那里的所有信息。如果该值包含毫秒,则date也将包含毫秒。源代码显示该值的精度为10微秒。

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

例如,o standard format specifier创建一个ISO8601格式的字符串:

var date=DateTime.UtcNow.ToString("o")
//2019-09-18T14:02:22.2048166Z

HH是两位数的说明符,它返回24小时值(0-23),而hh返回0到12之间的小时数。当使用hh时,{{ 1}}(还应使用AM / PM指示符),否则无法确定小时是10 AM还是10 PM。

此返回14:00,等等:

t

这将返回

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 可以解决此问题,但是返回的指示符将被本地化。为了确保使用特定的指示符,我们需要传递一个CultureInfo参数:

tt

将所有内容放在一起,以便从BigQuery中获取日期,然后使用AM / PM将其格式化为字符串:

DateTime.UtcNow.ToString("yyyy-MM-dd hh:mm:ss.fffffff tt",CultureInfo.InvariantCulture)
//2019-09-18 02:10:39.9194735 PM

使用字符串插值的等效项是:

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