如何强制 Power BI 服务使用本地时区

问题描述 投票:0回答:3

我目前正在从 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。有什么办法可以解决吗

powerbi microsoft-dynamics powerquery powerbi-desktop
3个回答
2
投票

我不久前也遇到过同样的问题,并提出了以下解决方案。

您可以简单地使用 RemoveZone 和 Addzone 电量查询功能的组合来实现此目的。下面的示例显示如何获取印度标准时间(IST = +5:30)

= DateTime.AddZone(DateTimeZone.RemoveZone(DateTimeZone.UtcNow()),5,30)

请注意,我使用

DateTimeZone.UtcNow()
始终获取通用标准日期时间,然后将其转换为印度时间。您可以使用自己的时区值

添加上述代码代替代码中的 DateTimeZone.ToLocal

DateTime.AddZone

的文档

0
投票

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

0
投票

获取尊重夏令时的日期时区有时有点棘手。我反复使用的解决方案是下面的函数。您只需输入夏季和冬季的偏移量,它就会返回您所在区域的正确时间。

(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/ )

干杯, 瑞克

© www.soinside.com 2019 - 2024. All rights reserved.