* Getting the 3 letter time zone abbreviation
@ 2020-04-29 8:46 Bob Goddard
2020-04-29 9:09 ` Dmitry A. Kazakov
0 siblings, 1 reply; 10+ messages in thread
From: Bob Goddard @ 2020-04-29 8:46 UTC (permalink / raw)
I'm sure this has been asked many times...
I need to get the 3 letter time zone abbreviation.
Does anyone have code that can do that?
Neither Ada.Calander, not ada_util can get it.
I did take a look at the tz db source code, and I shuddered multiple times.
B
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Getting the 3 letter time zone abbreviation
2020-04-29 8:46 Getting the 3 letter time zone abbreviation Bob Goddard
@ 2020-04-29 9:09 ` Dmitry A. Kazakov
2020-04-29 19:20 ` Bob Goddard
0 siblings, 1 reply; 10+ messages in thread
From: Dmitry A. Kazakov @ 2020-04-29 9:09 UTC (permalink / raw)
On 2020-04-29 10:46, Bob Goddard wrote:
> I'm sure this has been asked many times...
>
> I need to get the 3 letter time zone abbreviation.
3-4 you mean, e.g. CEST.
> Does anyone have code that can do that?
I had only a partial success. I used GTK/GLib time zone functions. The
abbreviation of the zone name is the thing. Unfortunately it works
poorly under Windows, and Windows updates tend to break time zone
settings [*] I needed to plant various fallback to deduce the zone from
UTC offset.
Anyway, Ada bindings are here:
http://www.dmitry-kazakov.de/ada/gtkada_contributions.htm#5.14
-----------
* I believe it was the case why one could not log into Origin account
for a couple of days not so long ago. Their server verified the time
zone and blocked access because Windows reported garbage.
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Getting the 3 letter time zone abbreviation
2020-04-29 9:09 ` Dmitry A. Kazakov
@ 2020-04-29 19:20 ` Bob Goddard
2020-04-29 19:53 ` Dmitry A. Kazakov
0 siblings, 1 reply; 10+ messages in thread
From: Bob Goddard @ 2020-04-29 19:20 UTC (permalink / raw)
On Wednesday, 29 April 2020 10:09:39 UTC+1, Dmitry A. Kazakov wrote:
> On 2020-04-29 10:46, Bob Goddard wrote:
> > I'm sure this has been asked many times...
> >
> > I need to get the 3 letter time zone abbreviation.
>
> 3-4 you mean, e.g. CEST.
>
> > Does anyone have code that can do that?
>
> I had only a partial success. I used GTK/GLib time zone functions. The
> abbreviation of the zone name is the thing. Unfortunately it works
> poorly under Windows, and Windows updates tend to break time zone
> settings [*] I needed to plant various fallback to deduce the zone from
> UTC offset.
>
> Anyway, Ada bindings are here:
>
> http://www.dmitry-kazakov.de/ada/gtkada_contributions.htm#5.14
>
> -----------
> * I believe it was the case why one could not log into Origin account
> for a couple of days not so long ago. Their server verified the time
> zone and blocked access because Windows reported garbage.
Seems easier just to import strftime and call it requesting just "%Z". This is on Linux, but MS suggests it should also work on Windows.
B
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Getting the 3 letter time zone abbreviation
2020-04-29 19:20 ` Bob Goddard
@ 2020-04-29 19:53 ` Dmitry A. Kazakov
2020-04-30 18:59 ` Bob Goddard
0 siblings, 1 reply; 10+ messages in thread
From: Dmitry A. Kazakov @ 2020-04-29 19:53 UTC (permalink / raw)
On 2020-04-29 21:20, Bob Goddard wrote:
> Seems easier just to import strftime and call it requesting just "%Z". This is on Linux, but MS suggests it should also work on Windows.
An interesting idea. Did you try it under Windows? (There is a
suspicious remark that it depends on the setlocale)
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Getting the 3 letter time zone abbreviation
2020-04-29 19:53 ` Dmitry A. Kazakov
@ 2020-04-30 18:59 ` Bob Goddard
2020-04-30 21:11 ` Dmitry A. Kazakov
0 siblings, 1 reply; 10+ messages in thread
From: Bob Goddard @ 2020-04-30 18:59 UTC (permalink / raw)
On Wednesday, 29 April 2020 20:53:11 UTC+1, Dmitry A. Kazakov wrote:
> On 2020-04-29 21:20, Bob Goddard wrote:
>
> > Seems easier just to import strftime and call it requesting just "%Z". This is on Linux, but MS suggests it should also work on Windows.
>
> An interesting idea. Did you try it under Windows? (There is a
> suspicious remark that it depends on the setlocale)
'Fraid not, I'm a Linux user. I just noticed that Windows does have it.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Getting the 3 letter time zone abbreviation
2020-04-30 18:59 ` Bob Goddard
@ 2020-04-30 21:11 ` Dmitry A. Kazakov
2020-05-02 12:46 ` Bob Goddard
0 siblings, 1 reply; 10+ messages in thread
From: Dmitry A. Kazakov @ 2020-04-30 21:11 UTC (permalink / raw)
On 2020-04-30 20:59, Bob Goddard wrote:
> On Wednesday, 29 April 2020 20:53:11 UTC+1, Dmitry A. Kazakov wrote:
>> On 2020-04-29 21:20, Bob Goddard wrote:
>>
>>> Seems easier just to import strftime and call it requesting just "%Z". This is on Linux, but MS suggests it should also work on Windows.
>>
>> An interesting idea. Did you try it under Windows? (There is a
>> suspicious remark that it depends on the setlocale)
>
> 'Fraid not, I'm a Linux user. I just noticed that Windows does have it.
OK, I tested it. As expected it does not work. For example this one:
---------------------------
with Ada.Command_Line; use Ada.Command_Line;
with Interfaces.C; use Interfaces.C;
with Ada.Exceptions; use Ada.Exceptions;
with Ada.Text_IO; use Ada.Text_IO;
with System;
procedure Strftime_Test is
type tm is record
tm_sec : int;
tm_min : int;
tm_hour : int;
tm_mday : int;
tm_mon : int;
tm_year : int;
tm_wday : int;
tm_yday : int;
tm_isdst : int;
end record;
pragma Convention (C, tm);
type tm_Ptr is access all tm;
pragma Convention (C, tm_Ptr);
type time_t is new Interfaces.Unsigned_64;
function localtime (timep : access time_t) return tm_Ptr;
pragma Import (C, localtime);
function time (destTime : System.Address := System.Null_Address)
return time_t;
pragma Import (C, time, "_time64");
function strftime
( strDest : char_array;
maxsize : size_t;
format : char_array;
timeptr : access tm
) return size_t;
pragma Import (C, strftime);
Result : size_t;
Buffer : char_array (1..200);
Now : aliased time_t := 0;
Local_Ptr : tm_Ptr;
begin
Now := time;
Put_Line ("Time=" & time_t'Image (Now));
Local_Ptr := localtime (Now'Access);
if Local_Ptr /= null then
declare
Local : tm renames localtime (Now'Access).all;
begin
Put_Line
( int'Image (Local.tm_year)
& " -"
& int'Image (Local.tm_mon)
& " -"
& int'Image (Local.tm_mday)
& " "
& int'Image (Local.tm_hour)
& " :"
& int'Image (Local.tm_min)
& " :"
& int'Image (Local.tm_sec)
);
Result := strftime
( Buffer,
Buffer'Length,
To_C ("%#Z"),
Local'Access
);
Put_Line ("Result=" & To_Ada (Buffer (1..Result), False));
end;
end if;
Set_Exit_Status (0);
exception
when Error : Status_Error | Data_Error =>
Put_Line (Exception_Message (Error));
Set_Exit_Status (1);
when Error : others =>
Put_Line ("Fault: " & Exception_Information (Error));
Set_Exit_Status (2);
end Strftime_Test;
----------------------------------
Gives the output on my Windows machine:
Result=W. Europe Daylight Time
instead of
CEST
Windows POSIX layer relies on Windows API. If the API does something
wrong, so would whatever POSIX function.
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Getting the 3 letter time zone abbreviation
2020-04-30 21:11 ` Dmitry A. Kazakov
@ 2020-05-02 12:46 ` Bob Goddard
2020-05-02 15:08 ` Bob Goddard
0 siblings, 1 reply; 10+ messages in thread
From: Bob Goddard @ 2020-05-02 12:46 UTC (permalink / raw)
Here goes...
On Linux and the various BSD's, the tm structure has been extended to include:
long int tm_gmtoff; /* Seconds east of UTC. */
const char *tm_zone; /* Timezone abbreviation. */
When you make a call to localtime_r, these are filled in with the correct into, at least on Linux.
The other big iron Unix's do not have this extension, and neither does Windows.
Windows also does not have localtime_r, instead it has localtime_s plus its 32 & 64 versions.
On the other Unix's & Windows, a call made to tzset (_tzset on Windows), which fills in tzname (_tzname under Windows). This should contain 2 record for non-saving & saving timezone name. and the correct entry can be garnered by way of tm_isdst.
To set another timezone, external var TZ should be set.
And don't test an example time of 1234 seconds past epoch for the UK expecting GMT. The UK was in fact in daylight saving time and double time (I think) for a few years. In my defence, I was only about 7yo and totally forgot about it.
There, clear as mud.
This works on Linux, the tm_zone is filled in by the call automatically...
with System;
with Interfaces;
with Interfaces.C;
with Interfaces.C.Strings;
package Unix is
type tm is record
tm_sec : Interfaces.C.int;
tm_min : Interfaces.C.int;
tm_hour : Interfaces.C.int;
tm_day : Interfaces.C.int;
tm_mon : Interfaces.C.int;
tm_year : Interfaces.C.int;
tm_wday : Interfaces.C.int;
tm_yday : Interfaces.C.int;
tm_isdst : Interfaces.C.int;
tm_gmtoff : Interfaces.C.long;
tm_zone : Interfaces.C.Strings.chars_ptr;
end record;
pragma Convention (C_Pass_By_Copy, tm);
procedure localtime_r (T : System.Address; TM_Struct : System.Address);
pragma Import (C, localtime_r, "localtime_r");
end Unix;
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Getting the 3 letter time zone abbreviation
2020-05-02 12:46 ` Bob Goddard
@ 2020-05-02 15:08 ` Bob Goddard
2020-05-02 15:38 ` Dmitry A. Kazakov
0 siblings, 1 reply; 10+ messages in thread
From: Bob Goddard @ 2020-05-02 15:08 UTC (permalink / raw)
And apparently this will not work on non BSD/Linux system, as we need access to the external var tzname, which, if going by the similarly external errno, would require a small C program.
Unless someone knows how to get access to arbitrary external vars.
Still, there is no reason why this could not be implemented in GNAT.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Getting the 3 letter time zone abbreviation
2020-05-02 15:08 ` Bob Goddard
@ 2020-05-02 15:38 ` Dmitry A. Kazakov
2020-05-02 19:25 ` Bob Goddard
0 siblings, 1 reply; 10+ messages in thread
From: Dmitry A. Kazakov @ 2020-05-02 15:38 UTC (permalink / raw)
On 2020-05-02 17:08, Bob Goddard wrote:
> And apparently this will not work on non BSD/Linux system, as we need access to the external var tzname, which, if going by the similarly external errno, would require a small C program.
>
> Unless someone knows how to get access to arbitrary external vars.
http://ada-auth.org/standards/12rm/html/RM-A-17.html
> Still, there is no reason why this could not be implemented in GNAT.
You can propose an AI for the incoming standard.
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Getting the 3 letter time zone abbreviation
2020-05-02 15:38 ` Dmitry A. Kazakov
@ 2020-05-02 19:25 ` Bob Goddard
0 siblings, 0 replies; 10+ messages in thread
From: Bob Goddard @ 2020-05-02 19:25 UTC (permalink / raw)
On Saturday, 2 May 2020 16:38:43 UTC+1, Dmitry A. Kazakov wrote:
> On 2020-05-02 17:08, Bob Goddard wrote:
> > And apparently this will not work on non BSD/Linux system, as we need access to the external var tzname, which, if going by the similarly external errno, would require a small C program.
> >
> > Unless someone knows how to get access to arbitrary external vars.
>
> http://ada-auth.org/standards/12rm/html/RM-A-17.html
>
> > Still, there is no reason why this could not be implemented in GNAT.
>
> You can propose an AI for the incoming standard.
RM-A-17 is for environmental vars, rather than external, ie library or system ones;
Anyway, turns out Windows does not support the IANA 3/4 letter tz database.
Calling tzset and examining the returned array, returns a string similar to "New Zealand Daylight Time".
tzset, at least on Linux, and I assume every other unix type system which uses the tz data base does return the 3/4 letter tz name.
Ho hum!
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2020-05-02 19:25 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-29 8:46 Getting the 3 letter time zone abbreviation Bob Goddard
2020-04-29 9:09 ` Dmitry A. Kazakov
2020-04-29 19:20 ` Bob Goddard
2020-04-29 19:53 ` Dmitry A. Kazakov
2020-04-30 18:59 ` Bob Goddard
2020-04-30 21:11 ` Dmitry A. Kazakov
2020-05-02 12:46 ` Bob Goddard
2020-05-02 15:08 ` Bob Goddard
2020-05-02 15:38 ` Dmitry A. Kazakov
2020-05-02 19:25 ` Bob Goddard
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox