当输入具有时区偏移量的CSV数据(在Blob存储中)时
2018-08-29T06:38:19 + 01:00
数据集的列具有区域性en-GB。
即
{
"name": "TransactionDateTime",
"type": "Datetime",
"culture": "en-gb"
},
它以以下形式降落在ADLS中:
2018-08-29 05:38:19.0000000
即使输出数据集区域性为en-gb,看起来它也被解析为+1,然后写为UTC。
大多数情况下,我们将en-gb设置为数据工厂的默认值是en-us,这对我们来说不是明智的默认值。
数据工厂文档建议查看c#文档中的格式字符串,因此我认为它使用的是.net框架实现。
如果s不包含时区信息,则s的Kind属性 返回的DateTime对象是DateTimeKind.Unspecified。这种行为 可以使用DateTimeStyles.AssumeLocal标志更改, 返回其Kind属性为DateTimeKind.Local的DateTime值,或者 通过使用DateTimeStyles.AssumeUniversal和 DateTimeStyles.AdjustToUniversal标志,该标志返回DateTime值 其Kind属性为DateTimeKind.Utc。如果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文化,我担心如何处理英国的夏季时间。除非以某种方式GB文化只是格式字符串,但我在任何CultureInfo中都看不到这样的格式字符串,所以我认为它不只是用于格式化。