Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions src/TimeZoneConverter/TZConvert.cs
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,12 @@ public static string IanaToWindows(string ianaTimeZoneName)
/// <returns><c>true</c> if successful, <c>false</c> otherwise.</returns>
public static bool TryIanaToWindows(string ianaTimeZoneName, [MaybeNullWhen(false)] out string windowsTimeZoneId)
{
if (string.IsNullOrWhiteSpace(ianaTimeZoneName))
{
windowsTimeZoneId = null;
return false;
}

return IanaMap.TryGetValue(ianaTimeZoneName, out windowsTimeZoneId!);
}

Expand Down Expand Up @@ -337,6 +343,12 @@ public static TimeZoneInfo GetTimeZoneInfo(string windowsOrIanaTimeZoneId)
public static bool TryGetTimeZoneInfo(string windowsOrIanaTimeZoneId,
[MaybeNullWhen(false)] out TimeZoneInfo timeZoneInfo)
{
if (string.IsNullOrWhiteSpace(windowsOrIanaTimeZoneId))
{
timeZoneInfo = null;
return false;
}

if (string.Equals(windowsOrIanaTimeZoneId, "UTC", StringComparison.OrdinalIgnoreCase))
{
timeZoneInfo = TimeZoneInfo.Utc;
Expand Down Expand Up @@ -395,6 +407,11 @@ public static IList<string> IanaToRails(string ianaTimeZoneName)
/// <returns><c>true</c> if successful, <c>false</c> otherwise.</returns>
public static bool TryIanaToRails(string ianaTimeZoneName, out IList<string> railsTimeZoneNames)
{
if (string.IsNullOrWhiteSpace(ianaTimeZoneName))
{
railsTimeZoneNames = Array.Empty<string>();
return false;
}

// in the case of an Etc/GMT+/-n zone, use the Rails fixed-offset zone. For example, `Etc/GMT-6` -> `+06:00` or `Etc/GMT+3` -> `-03:00`
if (ianaTimeZoneName.StartsWith("Etc/GMT", StringComparison.OrdinalIgnoreCase))
Expand Down Expand Up @@ -466,6 +483,12 @@ public static string RailsToIana(string railsTimeZoneName)
/// <returns><c>true</c> if successful, <c>false</c> otherwise.</returns>
public static bool TryRailsToIana(string railsTimeZoneName, [MaybeNullWhen(false)] out string ianaTimeZoneName)
{
if (string.IsNullOrWhiteSpace(railsTimeZoneName))
{
ianaTimeZoneName = null;
return false;
}

return RailsMap.TryGetValue(railsTimeZoneName, out ianaTimeZoneName);
}

Expand Down
73 changes: 73 additions & 0 deletions test/TimeZoneConverter.Tests/MiscTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
using Xunit.Abstractions;

namespace TimeZoneConverter.Tests;

public class MiscTests()
{
#pragma warning disable CS8625

[Fact]
public void No_Exception_From_TryGetTimeZoneInfo()
{
Assert.False(TZConvert.TryGetTimeZoneInfo(null, out var _));
Assert.False(TZConvert.TryGetTimeZoneInfo("", out var _));
Assert.False(TZConvert.TryGetTimeZoneInfo(" ", out var _));
Assert.False(TZConvert.TryGetTimeZoneInfo("blah", out var _));
}

[Fact]
public void No_Exception_From_TryIanaToRails()
{
Assert.False(TZConvert.TryIanaToRails(null, out var _));
Assert.False(TZConvert.TryIanaToRails("", out var _));
Assert.False(TZConvert.TryIanaToRails(" ", out var _));
Assert.False(TZConvert.TryIanaToRails("blah", out var _));
}

[Fact]
public void No_Exception_From_TryIanaToWindows()
{
Assert.False(TZConvert.TryIanaToWindows(null, out var _));
Assert.False(TZConvert.TryIanaToWindows("", out var _));
Assert.False(TZConvert.TryIanaToWindows(" ", out var _));
Assert.False(TZConvert.TryIanaToWindows("blah", out var _));
}

[Fact]
public void No_Exception_From_TryRailsToIana()
{
Assert.False(TZConvert.TryRailsToIana(null, out var _));
Assert.False(TZConvert.TryRailsToIana("", out var _));
Assert.False(TZConvert.TryRailsToIana(" ", out var _));
Assert.False(TZConvert.TryRailsToIana("blah", out var _));
}

[Fact]
public void No_Exception_From_TryRailsToWindows()
{
Assert.False(TZConvert.TryRailsToWindows(null, out var _));
Assert.False(TZConvert.TryRailsToWindows("", out var _));
Assert.False(TZConvert.TryRailsToWindows(" ", out var _));
Assert.False(TZConvert.TryRailsToWindows("blah", out var _));
}

[Fact]
public void No_Exception_From_TryWindowsToIana()
{
Assert.False(TZConvert.TryWindowsToIana(null, out var _));
Assert.False(TZConvert.TryWindowsToIana("", out var _));
Assert.False(TZConvert.TryWindowsToIana(" ", out var _));
Assert.False(TZConvert.TryWindowsToIana("blah", out var _));
}

[Fact]
public void No_Exception_From_TryWindowsToRails()
{
Assert.False(TZConvert.TryWindowsToRails(null, out var _));
Assert.False(TZConvert.TryWindowsToRails("", out var _));
Assert.False(TZConvert.TryWindowsToRails(" ", out var _));
Assert.False(TZConvert.TryWindowsToRails("blah", out var _));
}

#pragma warning restore CS8625
}