我正在使用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);
我在这里做错了什么?如何获得毫秒?
答案 0 :(得分:1)
答案 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);