首页 > 解决方案 > 数据工厂数据集时区处理

问题描述

当输入带有时区偏移量的 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 中都看不到这样的格式字符串,所以我不认为它只是用于格式化。

标签: c#datetimetimezoneazure-data-factory

解决方案


推荐阅读