Skip to content

Some POSIX time zones are not handled correctly #7690

@rjwats

Description

@rjwats

Basic Infos

  • This issue complies with the issue POLICY doc.
  • I have read the documentation at readthedocs and the issue is not addressed there.
  • I have tested that the issue is present in current master branch (aka latest git).
  • I have searched the issue tracker for a similar issue.
  • If there is a stack dump, I have decoded it.
  • I have filled out all fields below.

Platform

  • Hardware: [ESP-12]
  • Core Version: [2.7.4]
  • Development Env: [Arduino IDE]
  • Operating System: [Windows]

Settings in IDE

  • Module: [Generic ESP8266 Module]
  • Flash Mode: [dio]
  • Flash Size: [4MB]
  • lwip Variant: [v2 Lower Memory]
  • Reset Method: [nodemcu]
  • Flash Frequency: [40Mhz]
  • CPU Frequency: [80Mhz]
  • Upload Using: [SERIAL]
  • Upload Speed: [115200]

Problem Description

It looks as if some POSIX time zone strings may be being interpreted incorrectly when configured using:

configTime(const char* tz, const char* server1, const char* server2, const char* server3)

or

setTZ(const char* tz)

The following examples have been taken from TZ.h:

The following are some of the values which demonstrate the issue:

#define TZ_America_Sao_PauloPSTR("<-03>3") // Offset by +03:00 instead of -03:00 #define TZ_Africa_CasablancaPSTR("<+01>-1") // Offset by -01:00 instead of +01:00 #define TZ_America_AsuncionPSTR("<-04>4<-03>,M10.1.0/0,M3.4.0/0") // Offset by +4:00 instead of -03:00

This pattern appears consistent for all time zones which are defined in this format.

By contrast the following (also taken from TZ.h) do not exhibit this issue:

#define TZ_America_Los_AngelesPSTR("PST8PDT,M3.2.0,M11.1.0") // Offset by -08:00 #define TZ_Europe_RomePSTR("CET-1CEST,M3.5.0,M10.5.0/3") // Offset by +01:00 #define TZ_Europe_KaliningradPSTR("EET-2") // Offset by +02:00

All of the examples above were tested today @ ~1604351488 unix timestamp.

MCVE Sketch

#ifndef STASSID #define STASSID "VM723402-2G" #define STAPSK "gmwscxnu" #endif #include <TZ.h> #define MYTZ TZ_America_Sao_Paulo #include <ESP8266WiFi.h> #include <coredecls.h> #include <PolledTimeout.h> #include <time.h> #include <sys/time.h> extern "C" int clock_gettime(clockid_t unused, struct timespec *tp); static time_t now; static esp8266::polledTimeout::periodicMs showTimeNow(5000); String toISOString(tm* time) { char time_string[25]; strftime(time_string, 25, "%FT%T", time); return String(time_string); } void showTime() { now = time(nullptr); Serial.print("gmtime: "); Serial.println(toISOString(gmtime(&now))); Serial.print("localtime: "); Serial.println(toISOString(localtime(&now))); } void time_is_set_scheduled() { showTime(); } void setup() { Serial.begin(115200); Serial.println("Starting..."); settimeofday_cb(time_is_set_scheduled); // Set the timezone configTime(MYTZ, "pool.ntp.org"); // start network WiFi.persistent(false); WiFi.mode(WIFI_STA); WiFi.begin(STASSID, STAPSK); } void loop() { if (showTimeNow) { showTime(); } } 

Debug Messages

One example, when using TZ_America_Sao_Paulo, local time should be offset -03:00, instead it is offset +03:00:

gmtime: 2020-11-02T20:36:51 localtime: 2020-11-02T23:36:51 gmtime: 2020-11-02T20:36:56 localtime: 2020-11-02T23:36:56 gmtime: 2020-11-02T20:37:01 localtime: 2020-11-02T23:37:01 gmtime: 2020-11-02T20:37:06 localtime: 2020-11-02T23:37:06 

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions