aboutsummaryrefslogtreecommitdiff
path: root/timetolocal.c
diff options
context:
space:
mode:
authordavid <[email protected]>2026-09-28 11:15:28 -0300
committerdavid <[email protected]>2026-09-28 11:15:28 -0300
commit2aaa9bbecea6ab32bd1fe1b6470e24703405e2a7 (patch)
tree3d0b159405c19f3e4f30e6b7d06bfc0627c6eca3 /timetolocal.c
downloadtimetolocal-2aaa9bbecea6ab32bd1fe1b6470e24703405e2a7.tar.gz
timetolocal-2aaa9bbecea6ab32bd1fe1b6470e24703405e2a7.zip
yeah i think it has no bugs
Diffstat (limited to 'timetolocal.c')
-rw-r--r--timetolocal.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/timetolocal.c b/timetolocal.c
new file mode 100644
index 0000000..fce07d1
--- /dev/null
+++ b/timetolocal.c
@@ -0,0 +1,79 @@
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <time.h>
+#include <stdlib.h>
+#include "tztable.h"
+
+/*it's not case sensitive
+returns the offset
+returns -1 if it doesn't find it*/
+int findintable(char *what){
+ for(size_t i = 0; i < TZTABLE_LENGHT; i++){
+ if((strcasecmp(what, tz_table[i].zn)) == 0){
+ return tz_table[i].offset;
+ }
+ }
+return -1;
+}
+
+davidtime strtimetoint(char *whattimeisit) {
+ davidtime timehoursandminutes = {0, 0};
+
+ if (whattimeisit == NULL)return timehoursandminutes;
+
+ char buf[16];
+ strncpy(buf, whattimeisit, sizeof(buf) - 1);
+ buf[sizeof(buf) - 1] = '\0';
+
+ char *token = strtok(buf, ":");
+ if (token == NULL) return timehoursandminutes;
+ timehoursandminutes.hour = atoi(token);
+
+ token = strtok(NULL, ":");
+ if (token == NULL) return timehoursandminutes;
+ timehoursandminutes.minutes = atoi(token);
+
+ return timehoursandminutes;
+}
+
+int convert(char *timey, char *zone){
+ time_t rawtime = time(NULL);
+ struct tm *ptm = gmtime(&rawtime);
+
+ ptm->tm_isdst = -1;
+ time_t gmt = mktime(ptm);
+ int offset = difftime(rawtime, gmt) / 60;
+ //this sould take even daylight savings too, i stole it from stack overflow i've been trying to not use llms to code shit like this
+
+ //tmzn hour --> utc00 --> local time
+ if(findintable(zone)== -1){
+ return -1;
+ }
+ int zntime = findintable(zone);
+
+ davidtime eugh = strtimetoint(timey);
+ int zonetimeminutes = (eugh.hour*60)+eugh.minutes;
+ int normalizedminutes = zonetimeminutes+(zntime*-1); //utc00
+
+ int localminutes = (normalizedminutes+offset) % 1440;
+
+ davidtime finally;
+ finally.hour = localminutes/60;
+ finally.minutes = localminutes - finally.hour*60;
+ printf("%02d:%02d\n",finally.hour,finally.minutes);
+ return 0;
+}
+
+int main (int argc, char **argv){
+
+ if((argc <= 2) || (argc > 3)){
+ printf("%s: usage: %s [TIME (24hs)] [ZONE]\ne.g: %s 7:15 est\n", argv[0], argv[0], argv[0]);
+ exit(0);
+ }
+
+ if(convert(argv [1], argv[2]) == -1){
+ printf("%s: time zone not found, did you write it correctly?\n", argv[0]);
+ return 1;
+ }else return 0;
+}