Umwandlung Epoch nach DateTime

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Umwandlung Epoch nach DateTime

Beitrag von peter-pan »

Hallo Zusammen,
ich habe ein kleines Problem. Ich bekomme aus einem JSON-String einen Wert zurückgeliefert, von dem ich annehme, dass es ein Epoch-Wert ist.
Eine Umwandlung mittels Epoch-Converter bringt mir

Code: Alles auswählen

Convert epoch to human-readable date and vice versa
 [batch convert]
Supports Unix timestamps in seconds, milliseconds, microseconds and nanoseconds.
Assuming that this timestamp is in seconds:
GMT: Wednesday, 20. May 2020 10:14:12
Your time zone: Mittwoch, 20. Mai 2020 12:14:12 GMT+02:00 DST
Relative: An hour ago
Wenn ich versuche das per Regel umzuwandeln

Code: Alles auswählen

// #2 Get DateTimeType from Epoch  - https://community.openhab.org/t/datetime-conversion/54266
//Regarding to the flow chart this code converts from Epoch => #6 => to Joda => #11 => to String => #1 => to DateTimeType

     val DateTimeType MyDateTimeTypeFromEpoch = new DateTimeType(new DateTime(1589969652).toString)
     logInfo("Zeitraum testen","die Uhr hat diese Stunde geschlagen: " + MyDateTimeTypeFromEpoch)
     val String MyStringFromEpoch_VariantA = new DateTime(1589969652).toString
     logInfo("Zeitraum testen","die Uhr hat diese Stunde geschlagen: " + MyStringFromEpoch_VariantA)
......     
Kommt leider nur das

Code: Alles auswählen

2020-05-20 13:05:32.470 [INFO ] [arthome.model.script.Zeitraum testen] - die Uhr hat diese Stunde geschlagen: 1970-01-19T10:39:29.652+0100
2020-05-20 13:05:32.472 [INFO ] [arthome.model.script.Zeitraum testen] - die Uhr hat diese Stunde geschlagen: 1970-01-19T10:39:29.652+01:00
heraus :!: :?:
Der Original JSON-String sieht so aus:

Code: Alles auswählen

{
    "lat": 45.xx,
    "lon": 2.yy,
    "timezone": "Europe/Berlin",
    "timezone_offset": 7200,
    "current": {
        "dt": 1589925648,
        "sunrise": 1589945535,
        "sunset": 1590001330,
        "temp": 13.47,
        "feels_like": 11.82,
        "pressure": 1020,
        "humidity": 71,
        "dew_point": 8.32,
        "uvi": 7.47,
        "clouds": 13,
        "wind_speed": 1.8,
        "wind_deg": 51,
        "weather": [
            {
                "id": 801,
                "main": "Clouds",
                "description": "Ein paar Wolken",
                "icon": "02n"
            }
        ]
    },
    "daily": [
        {
            "dt": 1589972400,
            "sunrise": 1589945535,
            "sunset": 1590001330,
            "temp": {
                "day": 18.74,
                "min": 9.1,
                "max": 19.05,
                "night": 9.1,
                "eve": 15.51,
                "morn": 11.95
            },
            "feels_like": {
                "day": 17.04,
                "night": 7.7,
                "eve": 14.6,
                "morn": 10.87
            },
            "pressure": 1020,
            "humidity": 63,
            "dew_point": 11.73,
            "wind_speed": 3.12,
            "wind_deg": 28,
            "weather": [
                {
                    "id": 500,
                    "main": "Rain",
                    "description": "Leichter Regen",
                    "icon": "10d"
                }
            ],
            "clouds": 55,
            "rain": 0.74,
            "uvi": 7.47
        },
        {
            "dt": 1590058800,
            "sunrise": 1590031868,
            "sunset": 1590087806,
            "temp": {
                "day": 18.98,
                "min": 10.11,
                "max": 19.43,
                "night": 10.11,
                "eve": 16.26,
                "morn": 12.54
            },
            "feels_like": {
                "day": 17.3,
                "night": 8.93,
                "eve": 15.89,
                "morn": 11.37
            },
            "pressure": 1022,
            "humidity": 56,
            "dew_point": 10.21,
            "wind_speed": 2.46,
            "wind_deg": 79,
            "weather": [
                {
                    "id": 803,
                    "main": "Clouds",
                    "description": "Überwiegend bewölkt",
                    "icon": "04d"
                }
            ],
            "clouds": 54,
            "uvi": 7.57
        },
        {
            "dt": 1590145200,
            "sunrise": 1590118204,
            "sunset": 1590174280,
            "temp": {
                "day": 23.31,
                "min": 13.98,
                "max": 23.31,
                "night": 16.07,
                "eve": 18.87,
                "morn": 13.98
            },
            "feels_like": {
                "day": 22.7,
                "night": 15.79,
                "eve": 19.81,
                "morn": 13.17
            },
            "pressure": 1022,
            "humidity": 46,
            "dew_point": 11.26,
            "wind_speed": 1.34,
            "wind_deg": 242,
            "weather": [
                {
                    "id": 804,
                    "main": "Clouds",
                    "description": "Bedeckt",
                    "icon": "04d"
                }
            ],
            "clouds": 98,
            "uvi": 7.51
        },
        {
            "dt": 1590231600,
            "sunrise": 1590204541,
            "sunset": 1590260754,
            "temp": {
                "day": 11.08,
                "min": 6.18,
                "max": 20.7,
                "night": 6.18,
                "eve": 8.91,
                "morn": 17.22
            },
            "feels_like": {
                "day": 6.82,
                "night": 3.82,
                "eve": 5.69,
                "morn": 17.25
            },
            "pressure": 1025,
            "humidity": 88,
            "dew_point": 9.31,
            "wind_speed": 5.83,
            "wind_deg": 325,
            "weather": [
                {
                    "id": 501,
                    "main": "Rain",
                    "description": "Mäßiger Regen",
                    "icon": "10d"
                }
            ],
            "clouds": 91,
            "rain": 5.57,
            "uvi": 7.44
        },
        {
            "dt": 1590318000,
            "sunrise": 1590290881,
            "sunset": 1590347226,
            "temp": {
                "day": 17.03,
                "min": 7.34,
                "max": 17.04,
                "night": 7.34,
                "eve": 13.24,
                "morn": 9.01
            },
            "feels_like": {
                "day": 13.34,
                "night": 5.44,
                "eve": 12.02,
                "morn": 7.19
            },
            "pressure": 1033,
            "humidity": 44,
            "dew_point": 5.01,
            "wind_speed": 3.57,
            "wind_deg": 290,
            "weather": [
                {
                    "id": 801,
                    "main": "Clouds",
                    "description": "Ein paar Wolken",
                    "icon": "02d"
                }
            ],
            "clouds": 23,
            "uvi": 6.74
        },
        {
            "dt": 1590404400,
            "sunrise": 1590377223,
            "sunset": 1590433696,
            "temp": {
                "day": 20.19,
                "min": 10,
                "max": 20.28,
                "night": 10,
                "eve": 16.57,
                "morn": 12.37
            },
            "feels_like": {
                "day": 17.88,
                "night": 8.64,
                "eve": 15.88,
                "morn": 10.67
            },
            "pressure": 1030,
            "humidity": 45,
            "dew_point": 8.19,
            "wind_speed": 2.59,
            "wind_deg": 83,
            "weather": [
                {
                    "id": 800,
                    "main": "Clear",
                    "description": "Klarer Himmel",
                    "icon": "01d"
                }
            ],
            "clouds": 7,
            "uvi": 6.35
        },
        {
            "dt": 1590490800,
            "sunrise": 1590463567,
            "sunset": 1590520165,
            "temp": {
                "day": 25.15,
                "min": 13.01,
                "max": 25.15,
                "night": 13.01,
                "eve": 19.25,
                "morn": 13.96
            },
            "feels_like": {
                "day": 24.96,
                "night": 12.86,
                "eve": 19.4,
                "morn": 12.8
            },
            "pressure": 1028,
            "humidity": 40,
            "dew_point": 10.95,
            "wind_speed": 0.57,
            "wind_deg": 248,
            "weather": [
                {
                    "id": 801,
                    "main": "Clouds",
                    "description": "Ein paar Wolken",
                    "icon": "02d"
                }
            ],
            "clouds": 15,
            "uvi": 6.26
        },
        {
            "dt": 1590577200,
            "sunrise": 1590549913,
            "sunset": 1590606633,
            "temp": {
                "day": 24.91,
                "min": 17.44,
                "max": 24.91,
                "night": 24.91,
                "eve": 24.91,
                "morn": 17.44
            },
            "feels_like": {
                "day": 23.85,
                "night": 23.85,
                "eve": 23.85,
                "morn": 17.75
            },
            "pressure": 1025,
            "humidity": 45,
            "dew_point": 12.25,
            "wind_speed": 2.46,
            "wind_deg": 78,
            "weather": [
                {
                    "id": 801,
                    "main": "Clouds",
                    "description": "Ein paar Wolken",
                    "icon": "02d"
                }
            ],
            "clouds": 17,
            "uvi": 6.51
        }
    ]
}
Den lade ich mir per HTTP-Cache aus OpenWeatherMap (neue Api-Schnittstelle).

Hat mir jemand einen Tipp ??!!
von bastler » 20. Mai 2020 15:47
... das hat mich jetzt auch interessiert. es liegt wohl daran dass mit millisekunden gerechnet wird. wenn du an deine zahl drei nullen anhängst stimmt es. ich habs so (glaube / hoffe ich) hinbekommen:

Code: Alles auswählen

        val int json = 1589969652
        val long timestampEpoch = (json).longValue * 1000

        val DateTimeType MyDateTimeTypeFromEpoch = new DateTimeType(new DateTime(timestampEpoch).toString)
        logInfo("Zeitraum testen","die Uhr hat diese Stunde geschlagen: " + MyDateTimeTypeFromEpoch)
        val String MyStringFromEpoch_VariantA = new DateTime(timestampEpoch).toString
        logInfo("Zeitraum testen","die Uhr hat diese Stunde geschlagen: " + MyStringFromEpoch_VariantA)
Gehe zur vollständigen Antwort
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Umwandlung Epoch nach DateTime

Beitrag von bastler »

... das hat mich jetzt auch interessiert. es liegt wohl daran dass mit millisekunden gerechnet wird. wenn du an deine zahl drei nullen anhängst stimmt es. ich habs so (glaube / hoffe ich) hinbekommen:

Code: Alles auswählen

        val int json = 1589969652
        val long timestampEpoch = (json).longValue * 1000

        val DateTimeType MyDateTimeTypeFromEpoch = new DateTimeType(new DateTime(timestampEpoch).toString)
        logInfo("Zeitraum testen","die Uhr hat diese Stunde geschlagen: " + MyDateTimeTypeFromEpoch)
        val String MyStringFromEpoch_VariantA = new DateTime(timestampEpoch).toString
        logInfo("Zeitraum testen","die Uhr hat diese Stunde geschlagen: " + MyStringFromEpoch_VariantA)

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Umwandlung Epoch nach DateTime

Beitrag von peter-pan »

Ich hab's auch mal so probiert :

Code: Alles auswählen

     val DateTimeType MyDateTimeTypeFromEpoch = new DateTimeType(new DateTime(1589969652000).toString)
     logInfo("Zeitraum testen","die Uhr hat diese Stunde geschlagen: " + MyDateTimeTypeFromEpoch)
     val String MyStringFromEpoch_VariantA = new DateTime(1589969652000).toString
     logInfo("Zeitraum testen","die Uhr hat diese Stunde geschlagen: " + MyStringFromEpoch_VariantA)
Das gab dann die Meldung im Logger:

Code: Alles auswählen

2020-05-20 15:59:58.650 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'datum_testen.rules', using it anyway:
Invalid number format: Integer literal is out of range: 1589969652000
Invalid number format: Integer literal is out of range: 1589969652000
...deswegen hab ich da nicht weiter gemacht. Ausserdem hat VSC auch gemeckert.

Nachdem das aber bei dir geklappt hat, habe ich nun die Regel trotzdem mal laufen lassen (ohne Multiplikation, nur 3 Nullen drangehängt) und man glaubt es nicht, es funktioniert trotzdem.

Logger:

Code: Alles auswählen

2020-05-20 16:11:43.844 [INFO ] [arthome.model.script.Zeitraum testen] - die Uhr hat diese Stunde geschlagen: 2020-05-20T12:14:12.000+0200
2020-05-20 16:11:43.847 [INFO ] [arthome.model.script.Zeitraum testen] - die Uhr hat diese Stunde geschlagen: 2020-05-20T12:14:12.000+02:00
Da ich den Wert aber sowieso aus einem JSON-String extrahieren muss, werde ich deine Syntaxregel (mit Multi) verwenden um den String in einen Longwert umzuwandeln.

Danke und Gruss
Peter
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Antworten