0

Datumsbereich anzeigen

Hallo!

Ich möchte aus einem Startdatum und einem Enddatum einen sinnvoll angezeigten Datumsbereich formatieren. Irgendwie komme ich nicht drauf.

Also z.B. 

Startdatum: 20. Mai 2022

Enddatum: 23. Mai 2022

soll werden zu: 20.-23. Mai 2022.

Wenn das Enddatum im nächsten Monat liegt entsprechend z.B.:

20. Mai - 1. Juni 2022

und genauso wenn es über den Jahreswechsel geht:

20. Dezember 2022 - 1. Januar 2023

Hat jemand eine Idee? 

Und das ganze soll dann einmal mit englischen Monatsnamen und einmal mit deutschen ausgegeben werden. Puh...

9 Antworten

null
    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Vielleicht so:

    let a := BeginnDatum;
    let b := EndeDatum;
    if month(a) = month(b) and year(a) = year(b) then
        format(a, "DD.") + " - " + format(b, "DD. MMMM YYYY")
    else
        format(a, "DD. MMMM YYYY") + " - " + format(b, "DD. MMMM YYYY")
    end
    
    • rainless
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Sehe ich auch so wie Mirko - ganz kleine Ergänzung: Wenn das Jahr das gleiche ist, aber die Monate anders sind, soll noch eine weitere Unterscheidung gemacht werden.

    let a:= today();
    let b:= today() + 40; (oder 4 oder 400 ... zum Ausprobieren)
    if month(a) = month(b) and year(a) = year(b) then
        format(a, "DD.") + " - " + format(b, "DD. MMMM YYYY")
    else if year(a) = year(b) then
        format(a, "DD. MMMM") + " - " + format(b, "DD. MMMM YYYY")
    else
        format(a, "DD. MMMM YYYY") + " - " + format(b, "DD. MMMM YYYY")
    end
    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    englisch:

    let a := BeginnDatum;
    let b := EndeDatum;
    if a = b then
        format(a, "DD. MMMM YYYY")
    else
        let result := if month(a) = month(b) and year(a) = year(b) then
                format(a, "DD.") + " - " + format(b, "DD. MMMM YYYY")
            else
                format(a, "DD. MMMM YYYY") + " - " + format(b, "DD. MMMM YYYY")
            end;
        let enMonth := ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
        let monthNrA := month(BeginnDatum);
        let monthNrB := month(EndeDatum);
        if year(a) != year(b) or month(a) != month(b) and year(a) = year(b) then
            let splitter := split(result, "-");
            let first := replacex(item(splitter, 0), "[a-zA-Zä]+", item(enMonth, monthNrA - 1));
            let second := replacex(item(splitter, 1), "[a-zA-Zä]+", item(enMonth, monthNrB - 1));
            first + " - " + second
        else
            replacex(result, "[a-zA-Zä]+", item(enMonth, monthNrA - 1))
        end
    end
    
    • SMI
    • SMI
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Wow. Vielen Dank für eure Rückmeldung. 

    Ich habe es mithilfe eines anderen Forumbeitrages so kombiniert:

    function pn() do
        let a := Startdatum;
        let b := Enddatum;
        if month(a) = month(b) and year(a) = year(b) then
            format(a, "D.") + " - " + format(b, "DD. MMMM YYYY")
        else
            if year(a) = year(b) then
                format(a, "D. MMMM") + " - " + format(b, "D. MMMM YYYY")
            else
                format(a, "D. MMMM YYYY") + " - " + format(b, "D. MMMM YYYY")
            end
        end
    end;
    let DD := pn();
    let DD := replace(DD, "Januar", "January");
    let DD := replace(DD, "Februar", "February");
    let DD := replace(DD, "März", "March");
    let DD := replace(DD, "Mai", "May");
    let DD := replace(DD, "Juni", "June");
    let DD := replace(DD, "Juli", "July");
    let DD := replace(DD, "Oktober", "October");
    let DD := replace(DD, "Dezember", "December");
    DD

    Deine Lösung Mirko ist wohl die "Advanced" Variante... Brauch ich erstmal einen Kaffe um dadurch zu steigen.

    • rainless
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo SMI,

     

    durch das "Dictionary" ist mir noch eine kompaktere Idee gekommen, die direkt auf dem deutschen Ergebnis aufsetzt:

    let a:= today();
    let b:= today() + 22;
    
    let deResult := if month(a) = month(b) and year(a) = year(b) then
        format(a, "DD.") + " - " + format(b, "DD. MMMM YYYY")
    else if year(a) = year(b) then
        format(a, "DD. MMMM") + " - " + format(b, "DD. MMMM YYYY")
    else
        format(a, "DD. MMMM YYYY") + " - " + format(b, "DD. MMMM YYYY")
    end
    let enResult := deResult;
    let deMonth := ["Januar", "Februar", "März", "April", "Mai", "Juni", "July", "August", "September", "Oktober", "November", "Dezember"];
    let enMonth := ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    for i from 0 to 12 do
        enResult := replace(enResult, string(item(deMonth, i)), string(item(enMonth, i)));
    end;
    
    deResult + "
    " + enResult
    
      • SMI
      • SMI
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Lars Burgstahler Ah klasse! Ich wusste nicht, dass man an eine Variablen-Zuordnung gleich eine if-Bedingung anfügen kann! Das spart dann den Funktionsaufruf.

      • rainless
      • vor 2 Jahren
      • Gemeldet - anzeigen

      SMI Oh, das habe ich vorhin oben in dem Code von Mirko gelernt 😉 Schaust Du da ...

      Den zweiten Teil würde ich aber in einer Schleife machen. Wer weiß, wann Du noch Französisch brauchst.

      Nach genauer Überlegung vermute ich übrigens, dass Mirkos Code schneller ist. Bei nur 12 Monaten macht es aber vielleicht nicht so viel aus.

      • SMI
      • SMI
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Lars Und es sind ja auch nicht 12 Monate zu ersetzen, April bleibt April und September September, dadurch spart man sich bestimmt 2ms... :)

      ganz zu schweigen von August und November, damit sinds schon 4ms..

      • mirko3
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Lars Sehr schön. Dein Code ist deutlich aufgeräumter und auch besser zu lesen als meiner. Gefällt mir. Mirko

Content aside

  • vor 2 JahrenZuletzt aktiv
  • 9Antworten
  • 78Ansichten
  • 2 Folge bereits