--- Source/NSTimeZone.m.orig	2021-07-21 16:59:18.167047252 +0200
+++ Source/NSTimeZone.m	2021-07-21 17:13:26.577117105 +0200
@@ -253,9 +253,9 @@
   NSArray	*abbreviations;
   NSData	*timeZoneData;
   unsigned int	n_trans;
   unsigned int	n_types;
-  int32_t	*trans;
+  int64_t	*trans;
   TypeInfo	*types;
   unsigned char	*idxs;
 }
 @end
@@ -2996,9 +2996,9 @@
 static TypeInfo*
 chop(NSTimeInterval since, GSTimeZone *zone)
 {
   int32_t		when = (int32_t)since;
-  int32_t		*trans = zone->trans;
+  int64_t		*trans = zone->trans;
   unsigned		hi = zone->n_trans;
   unsigned		lo = 0;
   unsigned int		i;
 
@@ -3101,8 +3101,9 @@
       unsigned		pos = 0;
       unsigned		i, charcnt;
       unsigned char	*abbr;
       struct tzhead	*header;
+      unsigned  	trans_size = sizeof(int32_t);
 
       if (length < sizeof(struct tzhead))
 	{
 	  [NSException raise: fileException
@@ -3116,14 +3117,36 @@
 	  [NSException raise: fileException
 		      format: @"TZ_MAGIC is incorrect"];
 	}
 #endif
+      /* For version 2+, skip to second header */
+      if (header->tzh_version[0] != 0)
+        {
+          pos += GSSwapBigI32ToHost(*(int32_t*)(void*)header->tzh_timecnt) * 4
+	       + GSSwapBigI32ToHost(*(int32_t*)(void*)header->tzh_timecnt)
+	       + GSSwapBigI32ToHost(*(int32_t*)(void*)header->tzh_typecnt) * 6
+	       + GSSwapBigI32ToHost(*(int32_t*)(void*)header->tzh_charcnt)
+	       + GSSwapBigI32ToHost(*(int32_t*)(void*)header->tzh_leapcnt) * 8
+	       + GSSwapBigI32ToHost(*(int32_t*)(void*)header->tzh_ttisstdcnt)
+	       + GSSwapBigI32ToHost(*(int32_t*)(void*)header->tzh_ttisutcnt);
+	  header = (struct tzhead *)(bytes + pos);
+          pos += sizeof(struct tzhead);
+#ifdef TZ_MAGIC
+          if (memcmp(header->tzh_magic, TZ_MAGIC, strlen(TZ_MAGIC)) != 0)
+	    {
+	      [NSException raise: fileException
+		      format: @"TZ_MAGIC is incorrect (v2+ header)"];
+	    }
+#endif
+	  trans_size = sizeof(int64_t);
+	}
+
       n_trans = GSSwapBigI32ToHost(*(int32_t*)(void*)header->tzh_timecnt);
       n_types = GSSwapBigI32ToHost(*(int32_t*)(void*)header->tzh_typecnt);
       charcnt = GSSwapBigI32ToHost(*(int32_t*)(void*)header->tzh_charcnt);
 
       i = pos;
-      i += sizeof(int32_t)*n_trans;
+      i += trans_size*n_trans;
       if (i > length)
 	{
 	  [NSException raise: fileException
 		      format: @"Transitions list is truncated"];
@@ -3150,21 +3173,28 @@
        * Now calculate size we need to store the information
        * for efficient access ... not the same saze as the data
        * we received.
        */
-      i = n_trans * (sizeof(int32_t)+1) + n_types * sizeof(TypeInfo);
+      i = n_trans * (trans_size+1) + n_types * sizeof(TypeInfo);
       buf = NSZoneMalloc(NSDefaultMallocZone(), i);
       types = (TypeInfo*)buf;
       buf += (n_types * sizeof(TypeInfo));
-      trans = (int32_t*)buf;
-      buf += (n_trans * sizeof(int32_t));
+      trans = (int64_t*)buf;
+      buf += (n_trans * sizeof(int64_t)); 
       idxs = (unsigned char*)buf;
 
       /* Read in transitions. */
       for (i = 0; i < n_trans; i++)
 	{
-	  trans[i] = GSSwapBigI32ToHost(*(int32_t*)(bytes + pos));
-	  pos += sizeof(int32_t);
+	  u_int64_t t;
+       
+	  if (trans_size == sizeof(int64_t)) /* v2+ with 64-bit transitions */
+	    t = GSSwapBigI64ToHost(*(int64_t*)(bytes + pos));
+	  else /* v1 with 32-bit transitions */
+	    t = (u_int64_t)GSSwapBigI32ToHost(*(int32_t*)(bytes + pos));
+
+	  trans[i] = t;
+	  pos += trans_size;
 	}
       for (i = 0; i < n_trans; i++)
 	{
 	  idxs[i] = *(unsigned char*)(bytes + pos);
--- Source/nstzfile.h.orig	2021-07-21 16:59:31.890747499 +0200
+++ Source/nstzfile.h	2021-07-21 16:15:10.914419851 +0200
@@ -34,9 +34,10 @@
 #define	TZ_MAGIC	"TZif"
 
 struct tzhead {
  	char	tzh_magic[4];		/* TZ_MAGIC */
-	char	tzh_reserved[16];	/* reserved for future use */
+	char	tzh_version[1];		/* \0 for 1, 2 or 3 */
+	char	tzh_reserved[15];	/* reserved for future use */
 	char	tzh_ttisgmtcnt[4];	/* coded number of trans. time flags */
 	char	tzh_ttisstdcnt[4];	/* coded number of trans. time flags */
 	char	tzh_leapcnt[4];		/* coded number of leap seconds */
 	char	tzh_timecnt[4];		/* coded number of transition times */
