 <p>I'll focus my answer on this part of your question:</p> <blockquote> <p>How can I make sure that my DateTime -> NodaTime outputs are consistent, regardless of current location?</p> </blockquote> <p>Several places in your code, you call <code>.ToUniversalTime()</code> on a <code>DateTime</code> object. When you do that, the operation depends on the <code>DateTimeKind</code> value assigned to the <code>Kind</code> property of the object. Per <a href="https://msdn.microsoft.com/library/system.datetime.touniversaltime.aspx" rel="nofollow noreferrer">the MSDN docs</a>:</p> <p><a href="https://i.stack.imgur.com/rjgM9.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/rjgM9.png" alt="MSDN Table"></a></p> <p>Therefore, as long as the <code>Kind</code> is not <code>DateTimeKind.Utc</code>, then the input value is interpreted as being in the local time zone, and thus the conversion to UTC is affected by whatever that local time zone is on the computer where it is running, leading to inconsistent output.</p> <p>If you don't want your code to give different results when the local time zone differs between two computers, then you should not use this method. This is why option #2 and option #3 in your code give different results.</p> <p>As for option #1, it's not clear what you actually are trying to do. You are asserting that the input <code>dt</code> is in the <code>Africa/Johannesburg</code> time zone, but you never ask for any type of conversion. You are just emitting the same local value you passed in. If you meant to convert from UTC to South Africa, or vice-versa, then you need to explain that more clearly in the question. As it is, I cannot tell what you were actually wanting it to do.</p>