Lokala, fasta och UTC-varianter av aktuella tidsfunktioner

När du arbetar med Power Query i verktyg som Excel och Power BI är det viktigt att hantera datum- och tidsvärden korrekt, särskilt när dina datatransformeringar är beroende av den aktuella tiden. Power Query erbjuder olika funktioner för att hämta aktuellt datum och tid:

Den här artikeln utforskar skillnaderna mellan dessa funktioner och klargör när och varför du ska använda var och en. Dessutom markeras en kritisk men ofta förbisedd detalj. Power Query Online returnerar alltid UTC-tid även när du använder en funktion som är märkt som "Lokal". Att förstå dessa nyanser kan hjälpa dig att undvika oväntade resultat, särskilt när du skapar tidskänsliga rapporter eller automatiserar datauppdateringar i appar som Power BI-tjänsten eller Power Apps.

Skillnader mellan funktioner

Var och en av de aktuella tidsfunktionerna har viktiga skillnader. Dessa funktioner varierar när det gäller tidszonsmedvetenhet, volatilitet (om värdet ändras när det anropas flera gånger i samma fråga) och hur de beter sig i olika miljöer (skrivbord jämfört med online). Följande tabell innehåller en uppdelning av varje funktion.

Funktion Retur Flyktighet Skrivbordsbeteende Onlinebeteende Typiskt användningsfall
DateTime.LocalNow En datetime som representerar den aktuella lokala tiden Dynamisk – returnerar ett nytt värde varje gång det anropas under frågeutvärderingen Returnerar lokal maskintid Returnerar UTC-tid Snabb lokal tidsstämpel utan tidszonskontext
DateTimeZone.LocalNow Ett datetimezone värde som representerar den aktuella lokala tiden med tidszonsförskjutning Dynamisk – returnerar ett nytt värde varje gång det anropas under frågeutvärderingen Returnerar lokal tid med förskjutning Returnerar UTC-tid med +00:00 förskjutning Lokal tid med tidszonsmedvetenhet
DateTime.FixedLocalNow Ett datetime värde som representerar den lokala tiden när det först anropades under frågeutvärderingen Fast – returnerar samma värde i en enskild frågeutvärdering Fångar upp lokal tid när den först anropas Samlar in UTC-tid när den först anropas Ögonblicksbild av lokal tid utan tidszon
DateTimeZone.FixedLocalNow Ett datetimezone värde som representerar den lokala tiden med förskjutning när det först anropades under frågeutvärderingen Fast – returnerar samma värde i en enskild frågeutvärdering Samlar in den lokala tiden med tidsförskjutning vid första anropet Registrerar UTC-tid med +00:00 förskjutning när den först anropas Ögonblicksbild av lokal tid med tidszon
DateTimeZone.UtcNow Ett datetimezone värde som representerar den aktuella UTC-tiden Dynamisk – returnerar ett nytt värde varje gång det anropas under frågeutvärderingen Returnerar aktuell UTC-tid Returnerar aktuell UTC-tid Konsekvent UTC-tidsstämpel för dynamiska scenarier
DateTimeZone.FixedUtcNow Ett datetimezone värde som representerar UTC-tiden när det först anropades under frågeutvärderingen Fast – returnerar samma värde i en enskild frågeutvärdering Samlar in UTC-tid när den först anropas Samlar in UTC-tid när den först anropas UTC-tidsstämpel har fastställts för loggning eller granskning

I Power Query M är valet mellan lokala tids- och UTC-baserade datum- och tidsfunktioner ett viktigt designbeslut som påverkar konsekvensen, noggrannheten och portabiliteten för dina frågor. Funktioner som DateTime.LocalNow och DateTime.FixedLocalNow är användbara när logiken är beroende av den lokala systemtiden, till exempel filtrering för poster som inträffat "idag" eller generera tidsstämplar för användarriktade rapporter. Dessa funktioner återspeglar tidszonen för miljön där frågan körs, vilket gör dem lämpliga för Power Query Desktop-scenarier där den lokala kontexten är väldefinierad.

Men i distribuerade eller molnbaserade miljöer som Power Query Online returnerar samma funktioner UTC-tid, inte användarens faktiska lokala tid. Den här avvikelsen kan leda till subtila inkonsekvenser om logiken förutsätter en lokal tidskontext. Däremot tillhandahåller DateTimeZone.UtcNow och DateTimeZone.FixedUtcNow en tidszonsneutral referenspunkt som är konsekvent mellan miljöer och som inte påverkas av sommartid eller regionala inställningar. Dessa UTC-baserade funktioner är det bästa valet för scenarier som rör dataintegrering, loggning, granskning eller logik som måste bete sig identiskt oavsett var eller när frågan körs.

Skillnader mellan funktionerna LocalNow och FixedLocalNow

Power Query M innehåller fyra funktioner för att hämta den aktuella lokala tiden:

  • DateTime.LocalNow returnerar den aktuella lokal datetime varje gång uttrycket utvärderas.
  • DateTime.FixedLocalNow returnerar den lokala datetime utvärderingen en gång per fråga och fungerar som en ögonblicksbild.
  • DateTimeZone.LocalNow returnerar den aktuella lokal datetimezone varje gång uttrycket utvärderas.
  • DateTimeZone.FixedLocalNow returnerar den lokala datetimezone utvärderingen en gång per fråga och fungerar som en ögonblicksbild

För att visa skillnaden genererar följande exempel en tabell med flera rader. Varje rad samlar in ett nytt DateTime.LocalNow värde med hjälp av en fördröjning för att säkerställa distinkta tidsstämplar, medan varje insamlat DateTime.FixedLocalNow värde förblir konstant över alla rader.

Anmärkning

Alla datum och tider i utdata från exemplen i den här artikeln beror på när funktionerna körs. Datum och tider som visas i utdata är endast i demonstrationssyfte.

let
    // Create a table with LocalNow and FixedLocalNow columns 
    TableWithTimes = Table.FromList(
        {1..5},
        each {
            _,
            Function.InvokeAfter(() => DateTime.LocalNow(), #duration(0, 0, 0, 0.2)),
            Function.InvokeAfter(() => DateTime.FixedLocalNow(), #duration(0, 0, 0, 0.2))
        },
        {"Index", "LocalNow", "FixedLocalNow"}
    ),

    // Format both datetime columns
    FormatLocalNow = Table.TransformColumns(TableWithTimes, 
        {{"LocalNow", each DateTime.ToText(_, "yyyy-MM-ddThh:mm:ss.fff")}}),
    FormatFixedNow = Table.TransformColumns(FormatLocalNow, 
        {{"FixedLocalNow", each DateTime.ToText(_, "yyyy-MM-ddThh:mm:ss.fff")}}),

    // Change the table types
    FinalTable =  Table.TransformColumnTypes(FormatFixedNow, {{"Index", Int64.Type}, 
        {"LocalNow", type text}, {"FixedLocalNow", type text}})

in
    FinalTable

Utdata från det här exemplet är:

Skärmbild av tabellen som skapats av DateTime.LocalNow med dynamiska datum och tider och DateTime.FixedLocalNow med fasta datum och tider.

Om du tittar på utdata kanske du märker att även om DateTime.LocalNow funktionen visas först i koden, visar värdet som returneras för DateTime.FixedLocalNow en tid som inträffar före DateTime.LocalTime tiden. Även om DateTime.LocalNow visas först i tabellkonstruktionen är utvärderingsordningen i Power Query M inte garanterad att följa ordningen på fälten i en tabell. I stället använder Power Query en lat utvärderingsmodell. Att använda den här modellen innebär att fält endast utvärderas när det behövs och att motorn avgör utvärderingsordningen, inte ordningen i koden. I det här fallet utvärderas funktionen DateTime.FixedLocalNow först, så den första tiden som returneras för den här funktionen inträffar innan den första tiden som returneras för DateTime.LocalNow.

I följande exempel visas hur du skapar liknande resultat med hjälp av DateTimeZone.LocalNow och DateTimeZone.FixedLocalNow.

let
    // Create a table with LocalNow and FixedLocalNow columns 
    TableWithTimes = Table.FromList(
        {1..5},
        each {
            _,
            Function.InvokeAfter(() => DateTimeZone.LocalNow(), #duration(0, 0, 0, 0.2)),
            Function.InvokeAfter(() => DateTimeZone.FixedLocalNow(), #duration(0, 0, 0, 0.2))
        },
        {"Index", "LocalNow", "FixedLocalNow"}
    ),

    // Format both datetimezone columns
    FormatLocalNow = Table.TransformColumns(TableWithTimes, 
        {{"LocalNow", each DateTimeZone.ToText(_, "yyyy-MM-ddThh:mm:ss.fff:zzz")}}),
    FormatFixedNow = Table.TransformColumns(FormatLocalNow, 
        {{"FixedLocalNow", each DateTimeZone.ToText(_, "yyyy-MM-ddThh:mm:ss.fff:zzz")}}),

    //  Change the table types
    FinalTable =  Table.TransformColumnTypes(FormatFixedNow, 
        {{"Index", Int64.Type}, {"LocalNow", type text}, {"FixedLocalNow", type text}})
in
    FinalTable

Utdata från det här exemplet i Power Query Desktop är:

Skärmbild av tabellen som skapats av DateTimeZone.LocalNow med dynamiska datum och tider och DateTimeZone.FixedLocalNow med fasta datum och tider.

Anmärkning

Om du kör det här exemplet i Power Query Online är tiden som returneras alltid UTC-tid och tidszonsdelen av de returnerade värdena är alltid +00:00.

Skillnader mellan funktionerna UtcNow och FixedUtcNow

Power Query M innehåller två funktioner för att hämta den aktuella UTC-tiden:

  • DateTimeZone.UtcNow returnerar aktuell UTC datetimezone varje gång uttrycket utvärderas.
  • DateTimeZone.FixedUtcNow returnerar den lokala datetimezone utvärderingen en gång per fråga och fungerar som en ögonblicksbild.

Skillnaderna mellan dessa två funktioner liknar LocalNow funktionerna och FixedLocalNow . Men oavsett om funktionerna körs i Power Query Desktop eller Power Query Online returneras returvärdena alltid som UTC-tid. I följande exempel visas skillnaderna mellan dessa två funktioner.

let
    // Create a table with UtcNow and FixedUtcNow columns 
    TableWithTimes = Table.FromList(
        {1..5},
        each {
            _,
            Function.InvokeAfter(() => DateTimeZone.UtcNow(), #duration(0, 0, 0, 0.2)),
            Function.InvokeAfter(() => DateTimeZone.FixedUtcNow(), #duration(0, 0, 0, 0.2))
        },
        {"Index", "UtcNow", "FixedUtcNow"}
    ),

    // Format both datetimezone columns
    FormatLocalNow = Table.TransformColumns(TableWithTimes, 
        {{"UtcNow", each DateTimeZone.ToText(_, "yyyy-MM-ddThh:mm:ss.fff:zzz")}}),
    FormatFixedNow = Table.TransformColumns(FormatLocalNow, 
        {{"FixedUtcNow", each DateTimeZone.ToText(_, "yyyy-MM-ddThh:mm:ss.fff:zzz")}}),

    //  Change the table types
    FinalTable =  Table.TransformColumnTypes(FormatFixedNow, 
        {{"Index", Int64.Type}, {"UtcNow", type text}, {"FixedUtcNow", type text}})
in
    FinalTable

Utdata från det här exemplet i både Power Query Desktop och Power Query Online är:

Skärmbild av tabellen som skapats av DateTimeZone.UtcNow med dynamiska datum och tider och DateTimeZone.FixedUtcNow med fasta datum och tider.

Effekter på andra funktioner

Andra Power Query M-funktioner som är beroende av aktuellt datum och tid kan också påverkas av hur den lokala tiden returneras på antingen Power Query Desktop eller Power Query Online. Om du till exempel använder DateTimeZone.ToLocal funktionen för att konvertera UTC-tid till lokal tid returnerar den fortfarande UTC-tiden i Power Query Online.

Ett annat exempel är alla funktioner som kan använda den aktuella systemtiden som en parameter. Dessa funktioner omfattar Date.Month, Date.DayOfYear, DateTime.IsInCurrentYear eller DateTimeZone.ZoneHoursnågon annan funktion som kan utvärdera aktuellt datum och tid.

Om logiken i alla dessa funktioner är beroende av om ett värde ligger inom den aktuella dagen, timmen, månaden eller året kan resultaten skilja sig åt mellan miljöer. Dessa skillnader mellan miljöer är särskilt märkbara om frågan körs nära en gräns (till exempel strax före eller efter midnatt, början av en ny månad eller ett nytt år). Om konsekvens är avgörande i olika miljöer använder du DateTimeZone.UtcNow funktionerna eller DateTimeZone.FixedUtcNow för att hämta datum och tid.

Bästa praxis och rekommendationer

Om du väljer rätt tidsfunktion i Power Query beror på ditt specifika användningsfall, i vilken miljö frågan körs (skrivbord jämfört med online) och om du behöver en dynamisk eller fast tidsstämpel. Här följer några metodtips som hjälper dig att vägleda ditt beslut:

  • Var tydlig med tidszoner: Använd Funktionerna DateTimeZone i stället för DateTime-funktioner när tidszonskontexten är viktig. Använd DateTimeZone.UtcNow eller DateTimeZone.FixedUtcNow för konsekvens mellan miljöer, särskilt i molnbaserade lösningar som Power BI-tjänsten.
  • Använd fasta funktioner för repeterbara resultat: Använd de fasta varianterna (till exempel DateTimeZone.FixedUtcNow) när du vill att tidsstämpeln ska förbli konstant mellan frågeutvärderingar. Den här metoden är särskilt användbar för loggning, granskning eller insamling av tiden för datainmatning.
  • Undvik lokala funktioner i Power Query Online: Funktioner som DateTime.LocalNow och DateTimeZone.LocalNow returnerar UTC-tid i molnbaserade lösningar som Power BI-tjänsten, vilket kan leda till förvirring eller felaktiga antaganden. Om du behöver faktisk lokal tid i tjänsten kan du överväga att justera UTC manuellt med hjälp av kända förskjutningar (även om den här justeringen kan vara skör, till exempel på grund av sommartid eller regionala inställningar).
  • Testa i både skrivbords- och onlinemiljöer: Testa alltid dina frågor i både Power Query Desktop och Power Query Online om logiken är beroende av aktuell tid. Den här testningen hjälper till att fånga avvikelser tidigt, särskilt för schemalagda uppdateringsscenarier.
  • Dokumentera tidslogik: Kommentera eller dokumentera tydligt varför en viss tidsfunktion används, särskilt om du använder en lösning för tidszonshantering. Den här informationen hjälper framtida medarbetare att förstå avsikten bakom logiken.
  • Använd UTC för schemalagda arbetsflöden: För schemalagda uppdateringar eller automatiserade pipelines är UTC det säkraste och mest förutsägbara valet. Det undviker tvetydighet som orsakas av sommartid eller regionala tidszonsskift.
  • Cachetidsvärden vid behov: Om du behöver använda samma tidsstämpel i flera steg i en fråga tilldelar du den till en variabel överst i frågan med hjälp av en fast funktion. Den här variabeln säkerställer konsekvens i hela omvandlingslogik.