Skip to content

Commit 75abb2c

Browse files
Convert date time to local time zone prior to formatting. (#275)
1 parent 72ec26f commit 75abb2c

File tree

3 files changed

+42
-16
lines changed

3 files changed

+42
-16
lines changed

src/DIPS.Xamarin.UI/Converters/ValueConverters/DateAndTimeConverter.cs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
namespace DIPS.Xamarin.UI.Converters.ValueConverters
1010
{
1111
/// <summary>
12-
/// Converters a DateTime object with an format and convert it to a readable string
12+
/// Converters a DateTime object with a format and convert it to a readable string in local time zone
1313
/// </summary>
1414
public class DateAndTimeConverter : IMarkupExtension, IValueConverter
1515
{
@@ -36,6 +36,11 @@ public enum DateAndTimeConverterFormat
3636
Text,
3737
}
3838

39+
/// <summary>
40+
/// Ignores the conversion to local timezone
41+
/// </summary>
42+
public bool IgnoreLocalTime { get; set; } = false;
43+
3944
private const string Space = " ";
4045
private IServiceProvider m_serviceProvider;
4146

@@ -60,9 +65,9 @@ public object Convert(object value, Type targetType, object parameter, CultureIn
6065
throw new XamlParseException("The input has to be of type DateTime").WithXmlLineInfo(m_serviceProvider);
6166
return Format switch
6267
{
63-
DateAndTimeConverterFormat.Short => ConvertToShortFormat(dateTimeInput, culture),
68+
DateAndTimeConverterFormat.Short => ConvertToShortFormat(dateTimeInput, culture, IgnoreLocalTime),
6469
DateAndTimeConverterFormat.Text
65-
=> ConvertToTextFormat(dateTimeInput, culture),
70+
=> ConvertToTextFormat(dateTimeInput, culture, IgnoreLocalTime),
6671
_ => string.Empty
6772
};
6873
}
@@ -74,11 +79,11 @@ public object ConvertBack(object value, Type targetType, object parameter, Cultu
7479
throw new NotImplementedException();
7580
}
7681

77-
private static string ConvertToTextFormat(DateTime dateTimeInput, CultureInfo culture)
82+
private static string ConvertToTextFormat(DateTime dateTimeInput, CultureInfo culture, bool ignoreLocalTime)
7883
{
79-
var date = new DateConverter {Format = DateConverter.DateConverterFormat.Text}.Convert(dateTimeInput, null,
84+
var date = new DateConverter {Format = DateConverter.DateConverterFormat.Text, IgnoreLocalTime = ignoreLocalTime}.Convert(dateTimeInput, null,
8085
null, culture);
81-
var time = new TimeConverter {Format = TimeConverter.TimeConverterFormat.Default}.Convert(dateTimeInput,
86+
var time = new TimeConverter {Format = TimeConverter.TimeConverterFormat.Default, IgnoreLocalTime = ignoreLocalTime}.Convert(dateTimeInput,
8287
null, null, culture);
8388

8489
if (culture.IsNorwegian())
@@ -94,11 +99,11 @@ private static string ConvertToTextFormat(DateTime dateTimeInput, CultureInfo cu
9499
return $"{date}{Space}{time}";
95100
}
96101

97-
private static string ConvertToShortFormat(DateTime dateTimeInput, CultureInfo culture)
102+
private static string ConvertToShortFormat(DateTime dateTimeInput, CultureInfo culture, bool ignoreLocalTime)
98103
{
99-
var date = new DateConverter {Format = DateConverter.DateConverterFormat.Short}.Convert(dateTimeInput, null,
104+
var date = new DateConverter {Format = DateConverter.DateConverterFormat.Short, IgnoreLocalTime = ignoreLocalTime}.Convert(dateTimeInput, null,
100105
null, culture);
101-
var time = new TimeConverter {Format = TimeConverter.TimeConverterFormat.Default}.Convert(dateTimeInput,
106+
var time = new TimeConverter {Format = TimeConverter.TimeConverterFormat.Default, IgnoreLocalTime = ignoreLocalTime}.Convert(dateTimeInput,
102107
null, null, culture);
103108

104109
return culture.IsNorwegian() ? $"{date}{Space}kl{Space}{time}" : $"{date}{Space}{time}";

src/DIPS.Xamarin.UI/Converters/ValueConverters/DateConverter.cs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace DIPS.Xamarin.UI.Converters.ValueConverters
1111
{
1212
/// <summary>
13-
/// Converts an DateTime object to an format and convert it to a readable string
13+
/// Converts an DateTime object to a format and convert it to a readable string in local timezone
1414
/// </summary>
1515
public class DateConverter : IValueConverter, IMarkupExtension
1616
{
@@ -48,6 +48,11 @@ public enum DateConverterFormat
4848
/// </summary>
4949
public DateConverterFormat Format { get; set; }
5050

51+
/// <summary>
52+
/// Ignores the conversion to the local timezone
53+
/// </summary>
54+
public bool IgnoreLocalTime { get; set; }
55+
5156
/// <inheritdoc />
5257
[ExcludeFromCodeCoverage]
5358
public object ProvideValue(IServiceProvider serviceProvider)
@@ -64,9 +69,9 @@ public object Convert(object value, Type targetType, object parameter, CultureIn
6469
throw new XamlParseException("The input has to be of type DateTime").WithXmlLineInfo(m_serviceProvider);
6570
return Format switch
6671
{
67-
DateConverterFormat.Short => ConvertToDefaultDateTime(dateTimeInput, culture),
72+
DateConverterFormat.Short => ConvertToDefaultDateTime(dateTimeInput, culture, IgnoreLocalTime),
6873
DateConverterFormat.Text =>
69-
ConvertDateTimeAsText(dateTimeInput, culture),
74+
ConvertDateTimeAsText(dateTimeInput, culture, IgnoreLocalTime),
7075
_ => string.Empty
7176
};
7277
}
@@ -78,8 +83,13 @@ public object ConvertBack(object value, Type targetType, object parameter, Cultu
7883
throw new NotImplementedException();
7984
}
8085

81-
private static string ConvertToDefaultDateTime(DateTime dateTime, CultureInfo culture)
86+
private static string ConvertToDefaultDateTime(DateTime dateTime, CultureInfo culture, bool ignoreLocalTime)
8287
{
88+
if (!ignoreLocalTime)
89+
{
90+
dateTime = dateTime.ToLocalTime();
91+
}
92+
8393
var day = GetDayBasedOnCulture(dateTime, culture);
8494

8595
var month = GetMonthBasedOnCulture(dateTime, culture);
@@ -114,8 +124,13 @@ private static string GetDayBasedOnCulture(DateTime dateTime, CultureInfo cultur
114124
return day;
115125
}
116126

117-
private static string ConvertDateTimeAsText(DateTime dateTime, CultureInfo culture)
127+
private static string ConvertDateTimeAsText(DateTime dateTime, CultureInfo culture, bool ignoreLocalTime)
118128
{
129+
if (!ignoreLocalTime)
130+
{
131+
dateTime = dateTime.ToLocalTime();
132+
}
133+
119134
if (dateTime.IsToday())
120135
{
121136
return InternalLocalizedStrings.Today;

src/DIPS.Xamarin.UI/Converters/ValueConverters/TimeConverter.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
namespace DIPS.Xamarin.UI.Converters.ValueConverters
1010
{
1111
/// <summary>
12-
/// Converts an DateTime or TimeSpan object with a format and convert it to a readable time string
12+
/// Converts an DateTime or TimeSpan object with a format and convert it to a readable time string in local
13+
/// timezone
1314
/// </summary>
1415
public class TimeConverter : IMarkupExtension, IValueConverter
1516
{
@@ -32,6 +33,11 @@ public enum TimeConverterFormat
3233
/// </summary>
3334
public TimeConverterFormat Format { get; set; }
3435

36+
/// <summary>
37+
/// Ignores the conversion to the local timezone
38+
/// </summary>
39+
public bool IgnoreLocalTime { get; set; }
40+
3541
/// <inheritdoc />
3642
[ExcludeFromCodeCoverage]
3743
public object ProvideValue(IServiceProvider serviceProvider)
@@ -55,7 +61,7 @@ public object Convert(object value, Type targetType, object parameter, CultureIn
5561
dateTimeInput += timeSpanInput;
5662
break;
5763
case DateTime dateTimeValue:
58-
dateTimeInput = dateTimeValue;
64+
dateTimeInput = IgnoreLocalTime ? dateTimeValue : dateTimeValue.ToLocalTime();
5965
break;
6066
}
6167

0 commit comments

Comments
 (0)