c# - 数据工厂数据集时区处理
问题描述
当输入带有时区偏移量的 CSV 数据(在 blob 存储中)时,例如
2018-08-29T06:38:19+01:00
并且数据集具有该列的文化 en-GB。
IE
{
"name": "TransactionDateTime",
"type": "Datetime",
"culture": "en-gb"
},
它以如下方式登陆 ADLS:
2018-08-29 05:38:19.0000000
看起来它被解析为 +1,然后写为 UTC,即使输出数据集文化是 en-gb。
我们大多将 en-gb 设置为数据工厂中的默认值是 en-us,这对我们来说不是一个明智的默认值。
数据工厂文档建议查看格式字符串的 c# 文档,因此我假设它使用的是 .net 框架实现。
如果 s 不包含时区信息,则返回的 DateTime 对象的 Kind 属性为 DateTimeKind.Unspecified。可以使用 DateTimeStyles.AssumeLocal 标志更改此行为,该标志返回 Kind 属性为 DateTimeKind.Local 的 DateTime 值,或者使用 DateTimeStyles.AssumeUniversal 和 DateTimeStyles.AdjustToUniversal 标志,该标志返回 Kind 属性为 DateTimeKind 的 DateTime 值。世界标准时间。如果 s 包含时区信息,则根据需要将时间转换为本地时间,并将返回的 DateTime 对象的 Kind 属性设置为 DateTimeKind.Local。可以通过使用 DateTimeStyles.RoundtripKind 标志来更改此行为,以不将协调世界时 (UTC) 转换为本地时间并将 Kind 属性设置为 DateTimeKind.Utc。
试图在 c# 中重现这个,可能是这样的:
var inputInBlobDate = "2018-08-29T06:38:19+01:00";
var outputInADLSDate = "2018-08-29 05:38:19.0000000";
CultureInfo culture = new CultureInfo("en-GB");
var parsed = DateTime.ParseExact(inputInBlobDate, "yyyy-MM-ddTHH:mm:ssK", culture, DateTimeStyles.AdjustToUniversal);
parsed.ToString("yyyy-MM-dd HH:mm:ss.fffffff").Dump(); //2018-08-29 05:38:19.0000000
我的理论是否正确,它被写为UTC?
我担心如果我们指定英国文化,英国夏令时将如何处理。除非以某种方式 GB 文化只是格式字符串,但我在任何 CultureInfo 中都看不到这样的格式字符串,所以我不认为它只是用于格式化。
解决方案
推荐阅读
- spring - 在休息控制器中执行实体计数端点的适当方法是什么
- nginx - Nginx 代理通过查询参数传递
- javascript - 格式化日期方法返回错误的月份
- mysql - 三重连接sql
- php - 如何访问应用程序文件夹中的图像
- javascript - 如何获得音频 JS 的位深度/采样率?
- google-chrome - 是否可以创建 chrome 快捷方式以在同一窗口的不同选项卡中打开一组 URL?
- statistics - 如果SPSS中的列,如何从列表中获取具有最大值的列的标签?
- reactjs - 使用重新选择选择器时无法提供/测试传奇
- nativescript - 如何防止系统字体大小更改对 nativescript-angular android 应用程序的影响