Android Question Finding a way to get device's timezone ID

toby

Active Member
Licensed User
DateTime.TimeZoneOffset returns either -5 or -4 (Daylight saving Time) for New York and -6 or -5 (Daylight saving Time) for Chicago. As you can see, I could get -5 for both cities depending on whether Daylight Saving time is in effect and I have to handle the tricky Daylight Saving time related issue myself.

One solution is to use Timezone ID (such as "America/New_York" and "America/Chicago"). In my php code, I need to call date_default_timezone_set() function which expects a Timezone ID, i.e.,
B4X:
date_default_timezone_set("America/New_York");
I'm wondering what are some easy ways in B4A to get the phone device's Timezone ID.
 

toby

Active Member
Licensed User
I can use the daylight saving time function to find out if it's in effect. Now the device's timezone Id is only needed to call the php function.
 

Erel

Administrator
Staff member
Licensed User
I can use the daylight saving time function to find out if it's in effect
What do you need it for? As I wrote, if you are using it for time calculations then you are most probably doing something wrong.

You can get the id string with:
B4X:
Dim TimeZone As JavaObject
TimeZone = TimeZone.InitializeStatic("java.util.TimeZone").RunMethod("getDefault", Null)
Log(TimeZone.RunMethod("getID", Null))
 

toby

Active Member
Licensed User
In my app, I can't rely on the device's date and time because user can change it manually. So I'm getting the information from a ntp time server with a httpjob which passes the Timezone ID to the php script :
B4X:
            Dim j As HttpJob
            j.Initialize("", Me)
            j.Download2("https://samplesite.com/ntpTime.php",Array As String("timezone_id", "America/Toronto")) 'get datetime from ntp server

php script ntpTime.php:
B4X:
<?php
$timezone_id = $_GET["timezone_id"]; //"America/Toronto"
error_reporting(E_ALL ^ E_NOTICE);
ini_set("display_errors", 1);

date_default_timezone_set($timezone_id); //this is the only place Timezone ID is used

/* Query a time server (C) 1999-09-29, Ralf D. Kloth (QRQ.software) <ralf at qrq.de> */
function query_time_server ($timeserver, $socket)
{
    $fp = fsockopen($timeserver,$socket,$err,$errstr,5);
        # parameters: server, socket, error code, error text, timeout
    if($fp)
    {
        fputs($fp, "\n");
        $timevalue = fread($fp, 49);
        fclose($fp); # close the connection
    }
    else
    {
        $timevalue = " ";
    }

    $ret = array();
    $ret[] = $timevalue;
    $ret[] = $err;     # error code
    $ret[] = $errstr;  # error text
    return($ret);
} # function query_time_server


$timeserver ="ntp.pads.ufrj.br"; //"time1.google.com"; // "time.chu.nrc.ca"; //"ntp.pads.ufrj.br";
$timercvd = query_time_server($timeserver, 37);

//if no error from query_time_server
if(!$timercvd[1])
{
    $timevalue = bin2hex($timercvd[0]);
    $timevalue = abs(HexDec('7fffffff') - HexDec($timevalue) - HexDec('7fffffff'));
    $tmestamp = $timevalue - 2208988800; # convert to UNIX epoch time stamp
    $datum = date("Y-m-d (D) H:i:s",$tmestamp - date("Z",$tmestamp)); /* incl time zone offset */
    $doy = (date("z",$tmestamp)+1);

   // echo "Time check from time server ",$timeserver," : [<font color=\"red\">",$timevalue,"</font>]";
    //echo " (seconds since 1900-01-01 00:00.00).<br>\n";
    //echo "The current date and universal time is ",$datum," UTC. ";
    //echo "It is day ",$doy," of this year.<br>\n";
    //echo "The unix epoch time stamp is $tmestamp.<br>\n";


    echo date("d/m/Y H:i:s", $tmestamp);

}
else
{
    echo "Unfortunately, the time server $timeserver could not be reached at this time. ";
    echo "$timercvd[1] $timercvd[2].<br>\n";
}
?>
 
Top