<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Adrian Constantin Stanese</title>
    <description>The latest articles on DEV Community by Adrian Constantin Stanese (@adrian_constantinstanese).</description>
    <link>https://dev.to/adrian_constantinstanese</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4209113%2F9076200f-248d-487c-9121-a93551fc60ed.jpg</url>
      <title>DEV Community: Adrian Constantin Stanese</title>
      <link>https://dev.to/adrian_constantinstanese</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adrian_constantinstanese"/>
    <language>en</language>
    <item>
      <title>A free time-zone JSON API with no key: current time, DST-aware conversion, every IANA zone's clock changes</title>
      <dc:creator>Adrian Constantin Stanese</dc:creator>
      <pubDate>Mon, 26 Oct 2026 15:49:41 +0000</pubDate>
      <link>https://dev.to/adrian_constantinstanese/a-free-time-zone-json-api-with-no-key-current-time-dst-aware-conversion-every-iana-zones-clock-4cdd</link>
      <guid>https://dev.to/adrian_constantinstanese/a-free-time-zone-json-api-with-no-key-current-time-dst-aware-conversion-every-iana-zones-clock-4cdd</guid>
      <description>&lt;p&gt;Most free time APIs give you the current time in a zone and stop there. The hard part of time zones is the conversion edge cases and the rule changes, so I exposed the engine behind &lt;a href="https://hourora.app" rel="noopener noreferrer"&gt;hourora.app&lt;/a&gt; as a plain JSON API. No key, no sign-up, CORS enabled, 120 requests per minute per client, IANA tzdata 2026e.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current time
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://hourora.app/api/v1/time?tz=Europe/Bucharest
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns local time, ISO 8601 with offset, abbreviation, whether DST is active, ISO week, day of year, and the zone's next clock change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conversion that knows about the gaps
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://hourora.app/api/v1/convert?from=Europe/London&amp;amp;to=Asia/Tokyo&amp;amp;time=2027-03-28T01:30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;01:30 on 28 March 2027 does not exist in London (the clocks skip 01:00–02:00). The API says so instead of guessing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gapMinutes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"note"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2027-03-28T01:30:00 does not exist in Europe/London: the clocks skip it (spring forward). Read with the offset in force before the change, it falls at 2027-03-28T02:30:00 local time."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"iso"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2027-03-28T02:30:00+01:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"abbreviation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BST"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"iso"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2027-03-28T10:30:00+09:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"abbreviation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JST"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repeated hour in autumn comes back as &lt;code&gt;"status": "overlap"&lt;/code&gt; with both candidate instants.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every zone and its clock changes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://hourora.app/api/v1/zones?country=CA
GET https://hourora.app/api/v1/zones/America%2FVancouver?year=2026
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second one is how you find out that Vancouver has one transition in 2026 and none in 2027: British Columbia keeps its summer clock from November.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cities and coordinates
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://hourora.app/api/v1/cities?q=sao&amp;amp;limit=5
GET https://hourora.app/api/v1/lookup?lat=44.43&amp;amp;lng=26.10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;7,000 cities with slugs you can pass to &lt;code&gt;/time?city=&lt;/code&gt;, and a coordinates-to-zone lookup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why another one?
&lt;/h2&gt;

&lt;p&gt;Because the data behind it is the same compiled IANA release the site ships (about 15 KB gzipped, 1970–2060), updated within days of each tzdata release, and the engine is the one the site's converter and meeting planner use, so it is exercised by real traffic every day. Docs and the OpenAPI file: &lt;a href="https://hourora.app/en/developers" rel="noopener noreferrer"&gt;hourora.app/en/developers&lt;/a&gt; — &lt;code&gt;/api/v1/openapi.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Free for personal and commercial use, no SLA; attribution appreciated, not required. Feedback on the response shapes is welcome.&lt;/p&gt;

</description>
      <category>api</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
