<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="167060" data-post-id="167060">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="josevalim" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/120/1787_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  josevalim
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Elixir</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="mathieuprog" data-post="19" data-topic="29358">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mathieuprog/48/16860_2.png" class="avatar"> mathieuprog:</div>
<blockquote>
<p>To enable automatic updates, add <code>Tz.UpdatePeriodically</code> as a child in your supervisor:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">{Tz.UpdatePeriodically, []}
</code></pre>
<p>If you do not wish to update automatically, but still wish be alerted for new upcoming IANA updates, add <code>Tz.WatchPeriodically</code> as a child in your supervisor:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">{Tz.WatchPeriodically, []}
</code></pre>
</blockquote>
</aside>
<p>This has an issue. If two applications are using the tz library and each of them add to their own tree, they can probably race each other. It may be better if those are started under the Tz supervision tree and configured using the app environment. /cc <a class="mention" href="/u/sasajuric" rel="nofollow">@sasajuric</a></p>
<aside class="quote no-group quote-modified" data-username="mathieuprog" data-post="19" data-topic="29358">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mathieuprog/48/16860_2.png" class="avatar"> mathieuprog:</div>
<blockquote>
<p>case :erlang.get(:elixir_compiler_pid) do<br>
:undefined → &amp;Task.async/1<br>
_ → &amp;Kernel.ParallelCompiler.async/1<br>
end</p>
</blockquote>
</aside>
<p>Correct. But please keep in mind <code>:erlang.get(:elixir_compiler_pid)</code> is private API. We will have a <code>Code.can_await_modules_compilation?</code> in Elixir v1.11. So I recommend adding a TODO to use that instead in the future.</p>
<blockquote>
<p>Modules are purged after recompilation:</p>
</blockquote>
<p>If modules always have the same name, you don’t need to purge them. The VM will do it automatically the next time you load them. If you want to purge to reduce code size, then I would recommend purging it after some period of time - like a minute - as otherwise you may kill processes currently running the purged code.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="167060" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/tz-time-zone-support-for-elixir-alternative-to-tzdata-that-comes-with-a-lot-of-bugfixes/29358/23">Post #22</a>
	                </div>
	            </div>
              <div id="likers-container-167060" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="167060"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #22"></div>
  </section>
</div>
    <div class="postbit" id="167092" data-post-id="167092">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sasajuric" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sasajuric/120/991_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sasajuric
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Author of Elixir In Action</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote group-livebook_core_team" data-username="josevalim" data-post="23" data-topic="29358">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/48/1787_2.png" class="avatar"> josevalim:</div>
<blockquote>
<p>If two applications are using the tz library and each of them add to their own tree, they can probably race each other. It may be better if those are started under the Tz supervision tree and configured using the app environment. /cc <a class="mention" href="/u/sasajuric" rel="nofollow">@sasajuric</a></p>
</blockquote>
</aside>
<p>This is a good point, but I’m not sure app env would be my first choice <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p>
<p>The race condition issue could easily be tackled by having the interface a-la</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">Tz.PeriodicalUpdater.set_opts(opts)
</code></pre>
<p>which would start (or stop, depending on the options) a locally registered updater in the supervision tree of the dep. Repeated calls to this function would reconfigure the updater with the newest options (or amount to a noop).</p>
<p>However, I personally prefer to have as much of activities of the system in my app’s supervision tree. Periodical tz updating is an activity, and I like to have a control of when will that activity be started, and when will it stopped. For example, if I stop the part of the system which depends on tz, then I want to stop the updater too. Supervision tree allows me to have that.</p>
<p>Therefore, I actually like the proposed interface. The race condition can be solved by registering the process locally. However, if two apps are starting the updater the system will fail to start. If one of these apps is a lib dep (i.e. not an end app), I believe that it’s a sign the lib is trying to be overly smart. The decision about such updating should be left to the user.</p>
<p>If there are two apps in a “proper” umbrella (i.e. two otherwise independently deployed app which we’re running together locally for convenience), then some local configuration setting can fix the problem (e.g. don’t run the updater in app1 in dev/test mix env). In an umbrella disguised as a monolith, the issue boils down to a dev choosing one app where the updater will be running.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="167092" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/tz-time-zone-support-for-elixir-alternative-to-tzdata-that-comes-with-a-lot-of-bugfixes/29358/24">Post #23</a>
	                </div>
	            </div>
              <div id="likers-container-167092" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="167092"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #23"></div>
  </section>
</div>
    <div class="postbit" id="167123" data-post-id="167123">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="josevalim" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/120/1787_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  josevalim
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Elixir</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I am not a big fan of the <code>Tz.PeriodicalUpdater.set_opts(opts)</code> approach, because it introduces its own complexities when it comes to understanding which services will be started and run on boot and how they impact shutdown. Also, if you have a supervisor restarting, the dynamically added process would be lost.</p>
<p>However, registering and failing to start is a fair compromise. If a lib is trying to be too smart, as you said, then maybe the lib needs to export its own processes (or use the app env if necessary). So keeping it simple and leaving it up for someone else to tackle is fine (if it ever arises).</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="167123" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/tz-time-zone-support-for-elixir-alternative-to-tzdata-that-comes-with-a-lot-of-bugfixes/29358/25">Post #24</a>
	                </div>
	            </div>
              <div id="likers-container-167123" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="167123"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #24"></div>
  </section>
</div>
    <div class="postbit" id="167132" data-post-id="167132">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sasajuric" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sasajuric/120/991_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sasajuric
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Author of Elixir In Action</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote group-livebook_core_team" data-username="josevalim" data-post="25" data-topic="29358">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/48/1787_2.png" class="avatar"> josevalim:</div>
<blockquote>
<p>I am not a big fan of the <code>Tz.PeriodicalUpdater.set_opts(opts)</code> approach</p>
</blockquote>
</aside>
<p>Neither am I for the same reasons <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20">  I only mentioned it as a convenient (i.e. easy, but not necessarily simple) option. I’d still probably have that over app config, but then in the docs I’d advise users to only ever use <code>set_opts</code> in the application start callback. But yeah, a locally registered process would be my first choice here.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="167132" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/tz-time-zone-support-for-elixir-alternative-to-tzdata-that-comes-with-a-lot-of-bugfixes/29358/26">Post #25</a>
	                </div>
	            </div>
              <div id="likers-container-167132" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="167132"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #25"></div>
  </section>
</div>
    <div class="postbit" id="167247" data-post-id="167247">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mathieuprog" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mathieuprog/120/16860_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mathieuprog
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote group-livebook_core_team" data-username="josevalim" data-post="23" data-topic="29358">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/48/1787_2.png" class="avatar"> josevalim:</div>
<blockquote>
<p>If modules always have the same name, you don’t need to purge them. The VM will do it automatically the next time you load them. If you want to purge to reduce code size, then I would recommend purging it after some period of time - like a minute - as otherwise you may kill processes currently running the purged code.</p>
</blockquote>
</aside>
<p>The Erlang docs for <a href="https://erlang.org/doc/man/code.html#purge-1" rel="nofollow">code purging</a> mention:</p>
<blockquote>
<p>If some processes still linger in the old code, these processes are killed before the code is removed.</p>
<p>[…] a process is only considered to be lingering in the code if it has direct references to the code.</p>
</blockquote>
<p>So I guess I can just purge without a waiting time (although not sure what is meant by <em>direct reference</em> in the Erlang world).</p>
<aside class="quote group-livebook_core_team" data-username="josevalim" data-post="25" data-topic="29358">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/48/1787_2.png" class="avatar"> josevalim:</div>
<blockquote>
<p>maybe the lib needs to export its own processes (or use the app env if necessary)</p>
</blockquote>
</aside>
<aside class="quote no-group" data-username="sasajuric" data-post="26" data-topic="29358">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sasajuric/48/991_2.png" class="avatar"> sasajuric:</div>
<blockquote>
<p>a locally registered process would be my first choice here.</p>
</blockquote>
</aside>
<p>Any example libraries exporting a process, that takes the approach you recommend? I have actually not much experience with processes yet so either I need an example lib, or I’ll wait for someone to PR, or I’ll wait to have experience:D</p>
<p>If I understood correctly, the issue is having two apps under the same VM, each adding the worker in their supervisor, and triggering the execution of two recompilations at the same time.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="167247" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/tz-time-zone-support-for-elixir-alternative-to-tzdata-that-comes-with-a-lot-of-bugfixes/29358/27">Post #26</a>
	                </div>
	            </div>
              <div id="likers-container-167247" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="167247"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #26"></div>
  </section>
</div>
    <div class="postbit" id="167250" data-post-id="167250">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sasajuric" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sasajuric/120/991_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sasajuric
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Author of Elixir In Action</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="mathieuprog" data-post="27" data-topic="29358">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mathieuprog/48/16860_2.png" class="avatar"> mathieuprog:</div>
<blockquote>
<p>If I understood correctly, the issue is having two apps under the same VM, each adding the worker in their supervisor, and triggering the execution of two recompilations at the same time.</p>
</blockquote>
</aside>
<p>I’m not familiar with what the library is doing, but essentially yeah, the potential issue is that two apps start the updater process, and then somehow these multiple updaters step on each other’s toes.</p>
<p>If in practice that’s not an issue (i.e. multiple updaters may run safe in parallel), then I don’t think you need to do anything. Maybe adding an advice to other lib authors in the docs who might use this lib to avoid being smart, and to leave it to the end user instead to configure the updater.</p>
<p>If that is an issue, the fix could be to include something like <code>name: __MODULE__</code> when starting the updater process. This will ensure that only one instance of the updater is running in the beam. It should be easily testable with the help of <a href="https://hexdocs.pm/ex_unit/ExUnit.Callbacks.html#start_supervised/2" rel="noopener nofollow ugc">start_supervised</a>. Basically you start the updater process in the test, then try to start it again and assert that the result of the 2nd invocation is <code>{:error, {:already_started, pid}}</code>.</p>
<p>If you’re still unsure on how to approach this, let me know and I can take a look at the code and prep a PR. If you decide to do it yourself, you can make a PR and request a review from me (my GH handle is sasa1977).</p>
<p>Regarding prior art, I can’t think of anything off the top of my head, since IMO many Elixir/Erlang libs make some substandard choices. But I still think that this is a solid approach which can ensure singleton property while leaving enough flexibility to the client with respect to providing input parameters and controlling when/where is the process started.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="167250" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/tz-time-zone-support-for-elixir-alternative-to-tzdata-that-comes-with-a-lot-of-bugfixes/29358/28">Post #27</a>
	                </div>
	            </div>
              <div id="likers-container-167250" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="167250"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #27"></div>
  </section>
</div>
    <div class="postbit" id="204634" data-post-id="204634">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="slouchpie" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/slouchpie/120/34819_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  slouchpie
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Using <code>:tz</code>, how would I do the equivalent of <code>Tzdata.list_canonical_zones()</code> (<a href="https://hexdocs.pm/tzdata/0.1.2/Tzdata.html#canonical_zone_list/0" class="inline-onebox" rel="noopener nofollow ugc">Tzdata</a>)?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="204634" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/tz-time-zone-support-for-elixir-alternative-to-tzdata-that-comes-with-a-lot-of-bugfixes/29358/29">Post #28</a>
	                </div>
	            </div>
              <div id="likers-container-204634" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="204634"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #28"></div>
  </section>
</div>
    <div class="postbit" id="211391" data-post-id="211391">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="slouchpie" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/slouchpie/120/34819_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  slouchpie
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a class="mention" href="/u/mathieuprog" rel="nofollow">@mathieuprog</a> Using :tz, how would I do the equivalent of Tzdata.list_canonical_zones() ?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="211391" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/tz-time-zone-support-for-elixir-alternative-to-tzdata-that-comes-with-a-lot-of-bugfixes/29358/30">Post #29</a>
	                </div>
	            </div>
              <div id="likers-container-211391" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="211391"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #29"></div>
  </section>
</div>
    <div class="postbit" id="212320" data-post-id="212320">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mathieuprog" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mathieuprog/120/16860_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mathieuprog
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a class="mention" href="/u/slouchpie" rel="nofollow">@slouchpie</a> <code>:tz</code> API is intentionally kept as small as possible to implement <code>Calendar.TimeZoneDatabase</code>’s behaviour. Besides that, it only provides a function to get the version of the time zone database.</p>
<p>Utility functions around time zones are provided by <a href="https://github.com/mathieuprog/tz_extra" rel="noopener nofollow ugc">TzExtra</a>.</p>
<p>To get the time zone identifiers, see <code>TzExtra.time_zone_identifiers/1</code>.</p>
<p>Another function that might interest you if you are building a time zone picker is:<br>
<code>TzExtra.countries_time_zones/1</code></p>
<p>Those functions are described in the Readme file.<br>
Any feedback is welcome:)</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="212320" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/tz-time-zone-support-for-elixir-alternative-to-tzdata-that-comes-with-a-lot-of-bugfixes/29358/31">Post #30</a>
	                </div>
	            </div>
              <div id="likers-container-212320" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="212320"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #30"></div>
  </section>
</div>
    <div class="postbit" id="212332" data-post-id="212332">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="slouchpie" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/slouchpie/120/34819_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  slouchpie
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thank you! That’s perfect.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="212332" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/tz-time-zone-support-for-elixir-alternative-to-tzdata-that-comes-with-a-lot-of-bugfixes/29358/32">Post #31</a>
	                </div>
	            </div>
              <div id="likers-container-212332" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="212332"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #31"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/29358/load_more?page=4">Load more posts (17 remaining)</a>
</div></template></turbo-stream>