Browse Source

Merge pull request #24618 from abpframework/auto-merge/rel-10-0/4271

Merge branch rel-10.1 with rel-10.0
pull/24622/head
Ma Liming 4 weeks ago
committed by GitHub
parent
commit
17f7039c4e
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      Directory.Packages.props
  2. 31
      framework/src/Volo.Abp.Timing/Volo/Abp/Timing/TimeZoneHelper.cs
  3. 39
      framework/test/Volo.Abp.Timing.Tests/Volo/Abp/Timing/TimeZoneHelper_Tests.cs

2
Directory.Packages.props

@ -181,7 +181,7 @@
<PackageVersion Include="System.Text.Json" Version="10.0.0" />
<PackageVersion Include="System.Threading.Tasks.Extensions" Version="4.6.3" />
<PackageVersion Include="TencentCloudSDK.Sms" Version="3.0.1273" />
<PackageVersion Include="TimeZoneConverter" Version="7.0.0" />
<PackageVersion Include="TimeZoneConverter" Version="7.2.0" />
<PackageVersion Include="TickerQ" Version="2.5.3" />
<PackageVersion Include="TickerQ.Dashboard" Version="2.5.3" />
<PackageVersion Include="TickerQ.Utilities" Version="2.5.3" />

31
framework/src/Volo.Abp.Timing/Volo/Abp/Timing/TimeZoneHelper.cs

@ -7,14 +7,43 @@ namespace Volo.Abp.Timing;
public static class TimeZoneHelper
{
/// <summary>
/// Returns timezone list ordered by display name, enriched with UTC offset, filtering out invalid ids.
/// </summary>
public static List<NameValue> GetTimezones(List<NameValue> timezones)
{
return timezones
.OrderBy(x => x.Name)
.Select(x => new NameValue( $"{x.Name} ({GetTimezoneOffset(TZConvert.GetTimeZoneInfo(x.Name))})", x.Name))
.Select(TryCreateNameValueWithOffset)
.OfType<NameValue>()
.ToList();
}
/// <summary>
/// Builds a <see cref="NameValue"/> with the original timezone ID in <c>Value</c> and a display name that includes
/// the UTC offset in the <c>Name</c> property; returns null if the id is not found.
/// </summary>
public static NameValue? TryCreateNameValueWithOffset(NameValue timeZone)
{
try
{
var timeZoneInfo = TZConvert.GetTimeZoneInfo(timeZone.Name);
var name = $"{timeZone.Name} ({GetTimezoneOffset(timeZoneInfo)})";
return new NameValue(name, timeZone.Name);
}
catch (Exception)
{
// Invalid or unknown timezone IDs are expected here (e.g. from user input or
// external sources). We intentionally swallow this exception and return null
// so callers (like GetTimezones) can filter out invalid entries.
}
return null;
}
/// <summary>
/// Formats the base UTC offset as "+hh:mm" or "-hh:mm" for display purposes.
/// </summary>
public static string GetTimezoneOffset(TimeZoneInfo timeZoneInfo)
{
if (timeZoneInfo.BaseUtcOffset < TimeSpan.Zero)

39
framework/test/Volo.Abp.Timing.Tests/Volo/Abp/Timing/TimeZoneHelper_Tests.cs

@ -0,0 +1,39 @@
using System.Collections.Generic;
using Shouldly;
using TimeZoneConverter;
using Volo.Abp.Testing;
using Xunit;
namespace Volo.Abp.Timing;
public class TimeZoneHelper_Tests : AbpIntegratedTest<AbpTimingTestModule>
{
[Fact]
public void GetTimezones_Should_Filter_Invalid_Timezones()
{
var validTimeZoneId = "UTC";
var invalidTimeZoneId = "Invalid/Zone";
var timezones = new List<NameValue>
{
new(invalidTimeZoneId, invalidTimeZoneId),
new(validTimeZoneId, validTimeZoneId)
};
var result = TimeZoneHelper.GetTimezones(timezones);
result.Count.ShouldBe(1);
var expectedTimeZoneInfo = TZConvert.GetTimeZoneInfo(validTimeZoneId);
var expectedName = $"{validTimeZoneId} ({TimeZoneHelper.GetTimezoneOffset(expectedTimeZoneInfo)})";
result[0].Name.ShouldBe(expectedName);
result[0].Value.ShouldBe(validTimeZoneId);
}
[Fact]
public void TryCreateNameValueWithOffset_Should_Return_Null_For_Invalid_Timezone()
{
TimeZoneHelper.TryCreateNameValueWithOffset(new NameValue("Invalid/Zone", "Invalid/Zone")).ShouldBeNull();
}
}
Loading…
Cancel
Save