Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@
build
*.o
example
test/test
10 changes: 8 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
CC=gcc
CFLAGS=-I.
CFLAGS=-I. -std=gnu2x -Wall -Wextra -Werror
DEPS = zones.h

UTZ_DATA_DIR = vendor/tzdata
Expand All @@ -15,7 +15,7 @@ export UTZ_INCLUDES:=$(UTZ_INCLUDES)
all: zones.h zones.c

zones.h: $(UTZ_DATA_DIR) $(UTZ_INCLUDES) $(UTZ_WHITELIST) utils/generate_zones.py utils/utz.py
./utils/generate_zones.py
./utils/generate_zones.py -d vendor/tzdata -w $(UTZ_WHITELIST) -w whitelist-const.txt -b blacklist-const.txt -i majormetros
zones.c: zones.h

whitelist.txt: vendor/android/timezones.xml majormetros utils/compile_whitelist.py
Expand All @@ -35,3 +35,9 @@ example/example: utz.o zones.o examples/example.o

clean:
rm -f zones.h zones.c whitelist.txt utz.o zones.o examples/example.o example

test: test/test
./test/test

test/test: utz.o zones.o test/test.o
$(CC) $(CFLAGS) -o $@ $^ -I.
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,18 @@ packing all possible syntax of the source IANA tz database.
Instead a subset corresponding to the what is needed to correctly parse
most zones is implemented.

## Updating timezone database

1. Install python requirements:
`pip3 install -r requirements.txt`
2. If necessary, update vendor files in vendor/android, vendor/wikipedia, and vendor/tzdata
3. Compile timezone links. To do that you need a [GeoNames](https://www.geonames.org/) username:
`./utils/compile_tzlinks.py -u <username>`
4. Compile whitelisted timezones from the Android file:
`./utils/compile_whitelist.py`
5. Finally, generate the database:
`./utils/generate_zones.py -d vendor/tzdata -w whitelist.txt -i majormetros`

## Links

[zic man page and IANA tz database format documentation](https://linux.die.net/man/8/zic)
Expand Down
35 changes: 35 additions & 0 deletions blacklist-const.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
Asia/Oral
Asia/Changzhou
Asia/Chengdu
Asia/Chongqing
Asia/Guangzhou
Asia/Hangzhou
Asia/Harbin
Asia/Jinan
Asia/Nanchang
Asia/Nanjing
Asia/Qingdao
Asia/Shantou
Asia/Shenyang
Asia/Shanghai
Asia/Shenzhen
Asia/Tianjin
Asia/Wenzhou
Asia/Wuhan
Asia/Xi'an
Asia/Nagoya
Asia/Osaka
Europe/Hamburg
Europe/Stuttgart
Europe/Barcelona
Europe/Munich
Europe/Rhine-Ruhr
Asia/Calcutta
Asia/Surat
Asia/Pune
Asia/Kolkata
Asia/Hyderabad
Asia/Chennai
Asia/Bangalore
Asia/Ahmedabad
Asia/Mumbai
17 changes: 9 additions & 8 deletions examples/example.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,23 @@
#include "zones.h"

#include <stdio.h>
void main() {
printf("Total library db size: %d B\n", sizeof(zone_rules) + sizeof(zone_abrevs) + sizeof(zone_defns) + sizeof(zone_names));
int main() {
printf("Total library db size: %d B\n", sizeof(utz_zone_rules) + sizeof(utz_zone_abrevs) + sizeof(utz_zone_defns) + sizeof(utz_zone_names));

udatetime_t dt = {0};
dt.date.year = 17;
utz_datetime_t dt = {0};
dt.date.year = 2017;
dt.date.month = 9;
dt.date.dayofmonth = 26;
dt.time.hour = 1;
dt.time.minute = 0;
dt.time.second = 0;

uzone_t active_zone;
get_zone_by_name("San Francisco", &active_zone);
uoffset_t offset;
char c = get_current_offset(&active_zone, &dt, &offset);
utz_zone_t active_zone;
utz_get_zone_by_name("San Francisco", &active_zone);
utz_offset_t offset;
char c = utz_get_current_offset(&active_zone, &dt, &offset);
printf("%s, current offset: %d.%d\n", active_zone.name, offset.hours, offset.minutes / 60);
printf(active_zone.abrev_formatter, c);
printf("\n");
return 0;
}
8 changes: 5 additions & 3 deletions majormetros
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,19 @@ Link Asia/Kolkata Asia/Delhi
Link Asia/Kolkata Asia/Mumbai
Link Asia/Tokyo Asia/Osaka
Link Asia/Shanghai Asia/Wuhan
Link Asia/Chongqing Asia/Chengdu
Link Asia/Shanghai Asia/Chengdu
Link Asia/Shanghai Asia/Chongqing
Link Asia/Shanghai Asia/Tianjin
Link Asia/Shanghai Asia/Hangzhou
Link Asia/Chongqing Asia/Xi'an
Link Asia/Shanghai Asia/Xi'an
Link Asia/Shanghai Asia/Changzhou
Link America/Sao_Paulo America/Rio_de_Janeiro
Link Asia/Shanghai Asia/Shantou
Link Asia/Shanghai Asia/Nanjing
Link Europe/Berlin Europe/Rhine-Ruhr
Link Asia/Shanghai Asia/Jinan
Link Asia/Kolkata Asia/Bangalore
Link Asia/Shanghai Asia/Harbin
Link Asia/Karachi Asia/Lahore
Link Asia/Shanghai Asia/Zhengzhou
Link Asia/Shanghai Asia/Qingdao
Expand All @@ -24,7 +27,6 @@ Link Asia/Kolkata Asia/Hyderabad
Link Asia/Shanghai Asia/Shenyang
Link Asia/Shanghai Asia/Wenzhou
Link Asia/Shanghai Asia/Nanchang
Link America/Chicago America/DallasFort_Worth
Link America/Chicago America/Houston
Link Asia/Kolkata Asia/Ahmedabad
Link America/New_York America/Washington,_D.C.
Expand Down
17 changes: 13 additions & 4 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
BeautifulSoup
click
geopy
tzwhere
appdirs==1.4.4
beautifulsoup4==4.14.3
click==8.3.1
fissix==24.4.24
geographiclib==2.1
geopy==2.4.1
modernize==0.8.0
numpy==2.4.1
pytz==2025.2
shapely==2.1.2
soupsieve==2.8.3
typing_extensions==4.15.0
tzwhere==3.0.3
Loading