Reading Daylight Saving Time in Linux using C/C++


 
Thread Tools Search this Thread
Operating Systems Linux Reading Daylight Saving Time in Linux using C/C++
# 1  
Old 12-23-2009
Reading Daylight Saving Time in Linux using C/C++

Hi folks,
I would like to read the start date and end date of the Daylight Saving Time for the given timezone in the given year. What's the function in C/C++ to read the start of the Daylight Saving date and end of Daylight saving date?

I'm using Linux 2.6.xx Kernel.

For Example, in Pacific Time (US & Canada) the Daylight Start date for the year 2009 is Mar 9,2009 and it ended on Nov 1, 2009. I need a C/C++ function to read these dates.

Thanks in Advance,
Surya

Last edited by suryaemlinux; 12-23-2009 at 03:18 PM..
# 2  
Old 12-24-2009
I am not sure if C/C++ libraries has anything to do with the Linux kernel being used. You may need to check C/C++ documentation for the implementation.
# 3  
Old 12-24-2009
There are no standardized APIs for accessing the data you want from the relevant zoneinfo files. However if you do an Internet search for "ttisstdcnt" and "detzone" you will find plenty of examples of how it is done.
# 4  
Old 12-28-2009
I stayed out of this one for a while. Anytime you make assumptions about timezone or date you get in trouble - of all applications, calendrics and time get mishandled the most, IMO.

The std C runtime plus the environment is the final arbiter on what the system thinks about time and date.

This code is a rather stupid (with no error checking) brute force solution. It has assumptions: 32 bit system, years from 1970-2037, 2 ds time changes per year, and we are N of the equator. That way "start ds" is the first change we will hit if we begin Jan 01. Use at your own risk.

Code:
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <string.h>

#define FULL_FMT "%m-%d-%Y"
#define DT_LEN 80
#define TZ_LEN 28
#define DAY 86400

typedef
struct
{
  char start[DT_LEN];
  char tz1[TZ_LEN];  
  char end[DT_LEN];
  char tz2[TZ_LEN];
  
} dsavings_t;

char *sec2dt(char *dest, time_t sec, const char *fmt, char *cmp, dsavings_t *ds)
{
	struct tm *p=localtime(&sec);
	*dest=0x0;

	strftime(dest, DT_LEN, fmt, p);
	if(cmp!=NULL && strcmp(cmp, dest))
	{
		strcpy(   (*ds->tz1)?   ds->tz2: ds->tz1, cmp);
		strftime( (*ds->start)? ds->end: ds->start, DT_LEN, FULL_FMT, p);
		strcpy(cmp, dest);
	}
	return dest;
}

int tzshift(dsavings_t *ds, const int year)
{
	  struct tm w={0,0,0,0,0,0,0,0,0};
	  int i=0;
	  char tmp[DT_LEN]={0x0};
	  char tz[DT_LEN]={0x0};
	  time_t lt=0;
	  memset(ds, 0x0, sizeof(dsavings_t));	 	  
    sprintf(tmp,"01-01-%4d-23:00", year);
	  strptime(tmp, "%d-%m-%Y-%H:%M", &w);
	  lt=mktime(&w);
	  sec2dt(tz, lt, "%Z", NULL, NULL);
	  /*lt+=DAY; */
	  for(i=0; *(sec2dt(tmp, lt, "%Z", tz, ds)) && i<366; i++, lt+=DAY);	    
	  return (*ds->start && *ds->end)? 1 : 0;
}

int main(int argc, char **argv)
{
	  int yr=0;
	  dsavings_t ds={ {0x0}, {0x0} };
	  int retval=0;
	  for(yr=1970; yr < 2038; yr++)
	  {
	  		retval=tzshift(&ds, yr);
	  		printf("%d: %s (%s)  %s (%s)\n", yr, 
	  		       (retval) ? ds.start : "None",
	  		       (retval) ? ds.tz1 : "",
	  		       (retval) ? ds.end : "None",
	  		       (retval) ? ds.tz2 : "");
	  }
	  return 0;
}

# 5  
Old 01-07-2010
Thanks a lot, folks.
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Solaris

Solaris 11 Daylight Saving Time

Hello, Quick question: How do I verify if my Solaris 11 hosts/zones, configured with NTP, would change automatically to the DST? Thanks! (1 Reply)
Discussion started by: feroccimx
1 Replies

2. Linux

How does Linux handle DST ( daylight saving time)?

Hello Can sombody please tell me how linux handles DST ( daylight saving time) ? Does the time change instantly , ex: if is is 3'o clock does linux instantly swich to 2'o clock ? plese give more info about this toppic (2 Replies)
Discussion started by: martonlorand
2 Replies

3. Linux

How to configure daylight saving time

Hi, I have few doubt on daylight saving. Can any one clarify the below points. 1) How to configure daylight saving(DLS) time ? 2) How to query DLS ? 3) If i set DLS(say some how) will it be autometically changed or user has to manually change system time ? I got few info on net about... (3 Replies)
Discussion started by: ashokd001
3 Replies

4. UNIX for Advanced & Expert Users

Daylight saving not working properly with linux-2.6. kernel

The daylight saving action is not working Time zone was set for that Australia(parth) and issued reboot. Now for DST, (Daylight Saving Time): For 29 Oct 2006 (sunday) day, if set time is 1:59:00 than after 1 minute it will become 3:00:00 as per DST . This was found to be happening.i.e DST... (1 Reply)
Discussion started by: subratasaharia
1 Replies

5. UNIX for Dummies Questions & Answers

Daylight saving not working properly with linux-2.6. kernel

The daylight saving action is not working Time zone was set for that Australia(parth) and issued reboot. Now for DST, (Daylight Saving Time): For 29 Oct 2006 (sunday) day, if set time is 1:59:00 than after 1 minute it will become 3:00:00 as per DST . This was found to be happening.i.e DST... (1 Reply)
Discussion started by: subratasaharia
1 Replies

6. HP-UX

How to set the Daylight Saving Time (DST) OFF

I have a problem with the time so I need to set the DST to be OFF. is anybody can show me how to set the DST to be OFF? (11 Replies)
Discussion started by: Billy_yuli
11 Replies

7. AIX

Daylight Saving Time patch test

On AIX 5.1, after applying a DST patch or workaround, is there a way to test that the DST changes have taken effect? (1 Reply)
Discussion started by: dangral
1 Replies

8. Solaris

disable daylight saving

hi ... i have an E450 sun server that is running solaris 6 . i want to disable daylight savings on my server . My question is : 1) how to know that my server is running daylight savings ? 2) how to disable it ? my zoneinfo file contains the following # @(#)init.dfl 1.2 92/11/26 # #... (1 Reply)
Discussion started by: ppass
1 Replies

9. UNIX for Dummies Questions & Answers

Timestamp - confusion with daylight saving time

Hello! I'm currently working on a climatological dataset that uses unix-timestamp and a real date like 28/03/2004 02:45:00 h. in spring the unix-timestamp follows its continuos mode but in the column of the real date the time jumps one hour forward (e.g. from 1:59:59 to 3:00:00). i think this is... (1 Reply)
Discussion started by: softmachine
1 Replies
Login or Register to Ask a Question