我目前正在从 Dynamics 导出数据。我需要导出很多日期字段。默认情况下,它们都是 UTC 时区。我想报道新西兰时区的情况。我尝试在 Power Query 中进行处理:
1) use DateTimeZone.ToLocal: =Table.TransformColumns(#"dataset", {{"**UTC Date**", **DateTimeZone.ToLocal**, type datetimezone}})
2) use a specific timezone ("en-NZ"): =Table.TransformColumnTypes(#"dataset", {{"UTC Date", type datetime}}, **"en-NZ"**)
这两种方法在 Power BI 桌面报告中都可以正常工作,但是当我发布到 Power BI 服务并经过几次刷新(最初是新西兰时间)后,时间又回到了 UTC 时间。
我不想在 DAX 中创建额外的列,并且真的想尝试使用 Power Query。有什么办法可以解决吗
我不久前也遇到过同样的问题,并提出了以下解决方案。
您可以简单地使用 RemoveZone 和 Addzone 电量查询功能的组合来实现此目的。下面的示例显示如何获取印度标准时间(IST = +5:30)
= DateTime.AddZone(DateTimeZone.RemoveZone(DateTimeZone.UtcNow()),5,30)
请注意,我使用
DateTimeZone.UtcNow()
始终获取通用标准日期时间,然后将其转换为印度时间。您可以使用自己的时区值
添加上述代码代替代码中的 DateTimeZone.ToLocal。
的文档Power BI:
使用此 Power Query 功能将时间从 UTC 转换为本地时间,这里是山区时间,但您可以设置为无论新西兰时间是什么
let
ConvertDateColumnstoMountainTime = (sourcetable as table) as table =>
let
TargetColumnList = Table.ColumnsOfType(sourcetable, {type datetime, type nullable datetime, type datetimezone, type nullable datetimezone}),
AdjustTimeZones = Table.TransformColumns(sourcetable, List.Transform(TargetColumnList,
(name) => {name, (date) => if date <> null
then DateTime.From(DateTimeZone.RemoveZone(date) + #duration(0,CalculateUTCOffset(date,null),0,0))
else null})),
//Above returns type as text. Need it explicitly as Date.
AdjustColumnTypes = Table.TransformColumnTypes(AdjustTimeZones,List.Transform(TargetColumnList,
(name) => {name, type datetime}))
in AdjustColumnTypes
in ConvertDateColumnstoMountainTime
获取尊重夏令时的日期时区有时有点棘手。我反复使用的解决方案是下面的函数。您只需输入夏季和冬季的偏移量,它就会返回您所在区域的正确时间。
(Summer_GMT_Offset as number, Winter_GMT_Offset as number) =>
let
UTC_DateTimeZone = DateTimeZone.UtcNow(),
UTC_Date = Date.From( UTC_DateTimeZone ),
StartSummerTime = Date.StartOfWeek( #date( Date.Year( UTC_Date ) , 3 , 31 ), Day.Sunday ),
StartWinterTime = Date.StartOfWeek( #date( Date.Year( UTC_Date ) , 10, 31 ), Day.Sunday ),
UTC_Offset = if UTC_Date >= StartSummerTime and UTC_Date < StartWinterTime then Summer_GMT_Offset else Winter_GMT_Offset,
CET_Timezone = DateTimeZone.SwitchZone( UTC_DateTimeZone, UTC_Offset)
in
CET_Timezone
您可以通过以下方式找到逐步解释:https://gorilla.bi/power-query/last-refresh-datetime/
关键是 DateTimeZone.UtcNow 返回一个固定值(https://powerquery.how/datetimezone-utcnow/)。
然后检查当前日期是否属于冬季或夏季期间,并使用它来通过 DateTimeZone.SwitchZone 调整时区偏移(https://powerquery.how/datetimezone-switchzone/ )
干杯, 瑞克