Skip to content

Commit 6b3c6ba

Browse files
authored
Added DateTimeFormatter (#323)
* Created DateTimeFormatter * Update DateTimeFormatter.cs * Update DateTimeFormatter.cs * Update DateConverter.cs * Added comments and defaults * Added methods with CurrentCulture * Update TimeConverter.cs * Update TimeConverter.cs
1 parent 1897e10 commit 6b3c6ba

File tree

5 files changed

+334
-179
lines changed

5 files changed

+334
-179
lines changed

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

Lines changed: 11 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,8 @@ public enum DateAndTimeConverterFormat
3939
/// <summary>
4040
/// Ignores the conversion to local timezone
4141
/// </summary>
42-
public bool IgnoreLocalTime { get; set; } = false;
42+
public bool IgnoreLocalTime { get; set; }
4343

44-
private const string Space = " ";
4544
private IServiceProvider m_serviceProvider;
4645

4746
/// <summary>
@@ -60,53 +59,24 @@ public object ProvideValue(IServiceProvider serviceProvider)
6059
/// <inheritdoc />
6160
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
6261
{
63-
if (value == null) return string.Empty;
64-
if (!(value is DateTime dateTimeInput))
65-
throw new XamlParseException("The input has to be of type DateTime").WithXmlLineInfo(m_serviceProvider);
66-
return Format switch
62+
if (value == null)
6763
{
68-
DateAndTimeConverterFormat.Short => ConvertToShortFormat(dateTimeInput, culture, IgnoreLocalTime),
69-
DateAndTimeConverterFormat.Text
70-
=> ConvertToTextFormat(dateTimeInput, culture, IgnoreLocalTime),
71-
_ => string.Empty
72-
};
73-
}
74-
75-
/// <inheritdoc />
76-
[ExcludeFromCodeCoverage]
77-
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
78-
{
79-
throw new NotImplementedException();
80-
}
81-
82-
private static string ConvertToTextFormat(DateTime dateTimeInput, CultureInfo culture, bool ignoreLocalTime)
83-
{
84-
var date = new DateConverter {Format = DateConverter.DateConverterFormat.Text, IgnoreLocalTime = ignoreLocalTime}.Convert(dateTimeInput, null,
85-
null, culture);
86-
var time = new TimeConverter {Format = TimeConverter.TimeConverterFormat.Default, IgnoreLocalTime = ignoreLocalTime}.Convert(dateTimeInput,
87-
null, null, culture);
64+
return string.Empty;
65+
}
8866

89-
if (culture.IsNorwegian())
67+
if (value is not DateTime dateTimeInput)
9068
{
91-
if (dateTimeInput.IsToday() || dateTimeInput.IsTomorrow() || dateTimeInput.IsYesterday())
92-
{
93-
return $"{date},{Space}kl{Space}{time}";
94-
}
95-
96-
return $"{date}{Space}kl{Space}{time}";
69+
throw new XamlParseException("The input has to be of type DateTime").WithXmlLineInfo(m_serviceProvider);
9770
}
9871

99-
return $"{date}{Space}{time}";
72+
return DateTimeFormatter.FormatDateAndTime(dateTimeInput, culture, IgnoreLocalTime, Format);
10073
}
10174

102-
private static string ConvertToShortFormat(DateTime dateTimeInput, CultureInfo culture, bool ignoreLocalTime)
75+
/// <inheritdoc />
76+
[ExcludeFromCodeCoverage]
77+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
10378
{
104-
var date = new DateConverter {Format = DateConverter.DateConverterFormat.Short, IgnoreLocalTime = ignoreLocalTime}.Convert(dateTimeInput, null,
105-
null, culture);
106-
var time = new TimeConverter {Format = TimeConverter.TimeConverterFormat.Default, IgnoreLocalTime = ignoreLocalTime}.Convert(dateTimeInput,
107-
null, null, culture);
108-
109-
return culture.IsNorwegian() ? $"{date}{Space}kl{Space}{time}" : $"{date}{Space}{time}";
79+
throw new NotImplementedException();
11080
}
11181
}
11282
}
Lines changed: 14 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
using System;
22
using System.Diagnostics.CodeAnalysis;
33
using System.Globalization;
4-
using DIPS.Xamarin.UI.Extensions;
54
using DIPS.Xamarin.UI.Internal.Utilities;
6-
using DIPS.Xamarin.UI.Resources.LocalizedStrings;
75
using Xamarin.Forms;
86
using Xamarin.Forms.Xaml;
97

@@ -13,7 +11,8 @@ namespace DIPS.Xamarin.UI.Converters.ValueConverters
1311
/// Converts an DateTime object to a format and convert it to a readable string in local timezone
1412
/// </summary>
1513
public class DateConverter : IValueConverter, IMarkupExtension
16-
{
14+
{
15+
1716
/// <summary>
1817
/// The formats to choose between during conversion
1918
/// </summary>
@@ -39,15 +38,13 @@ public enum DateConverterFormat
3938
/// </remarks>
4039
Text,
4140
}
42-
43-
private const string Space = " ";
4441
private IServiceProvider m_serviceProvider;
45-
42+
4643
/// <summary>
47-
/// The format to choose between, see <see cref="DateConverterFormat" />
44+
///
4845
/// </summary>
4946
public DateConverterFormat Format { get; set; }
50-
47+
5148
/// <summary>
5249
/// Ignores the conversion to the local timezone
5350
/// </summary>
@@ -64,108 +61,24 @@ public object ProvideValue(IServiceProvider serviceProvider)
6461
/// <inheritdoc />
6562
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
6663
{
67-
if (value == null) return string.Empty;
68-
if (!(value is DateTime dateTimeInput))
69-
throw new XamlParseException("The input has to be of type DateTime").WithXmlLineInfo(m_serviceProvider);
70-
return Format switch
71-
{
72-
DateConverterFormat.Short => ConvertToDefaultDateTime(dateTimeInput, culture, IgnoreLocalTime),
73-
DateConverterFormat.Text =>
74-
ConvertDateTimeAsText(dateTimeInput, culture, IgnoreLocalTime),
75-
_ => string.Empty
76-
};
77-
}
78-
79-
/// <inheritdoc />
80-
[ExcludeFromCodeCoverage]
81-
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
82-
{
83-
throw new NotImplementedException();
84-
}
85-
86-
private static string ConvertToDefaultDateTime(DateTime dateTime, CultureInfo culture, bool ignoreLocalTime)
87-
{
88-
if (!ignoreLocalTime)
89-
{
90-
dateTime = dateTime.ToLocalTime();
91-
}
92-
93-
var day = GetDayBasedOnCulture(dateTime, culture);
94-
95-
var month = GetMonthBasedOnCulture(dateTime, culture);
96-
var year = dateTime.ToString("yyyy", culture);
97-
if (culture.ThreeLetterWindowsLanguageName.Equals("ENU"))
98-
{
99-
return $"{month}{Space}{day}{Space}{year}";
100-
}
101-
102-
return $"{day}{Space}{month}{Space}{year}";
103-
}
104-
105-
private static string GetDayBasedOnCulture(DateTime dateTime, CultureInfo culture)
106-
{
107-
var day = dateTime.ToString("dd", culture);
108-
if (culture.TwoLetterISOLanguageName.Contains("en"))
109-
{
110-
day = day.TrimStart('0');
111-
day += dateTime.GetEnglishDaySuffix();
112-
}
113-
114-
if (culture.ThreeLetterWindowsLanguageName.Equals("ENU"))
115-
{
116-
day += ",";
117-
}
118-
119-
if (culture.IsNorwegian())
120-
{
121-
day += ".";
122-
}
123-
124-
return day;
125-
}
126-
127-
private static string ConvertDateTimeAsText(DateTime dateTime, CultureInfo culture, bool ignoreLocalTime)
128-
{
129-
if (!ignoreLocalTime)
64+
if (value == null)
13065
{
131-
dateTime = dateTime.ToLocalTime();
132-
}
133-
134-
if (dateTime.IsToday())
135-
{
136-
return InternalLocalizedStrings.Today;
66+
return string.Empty;
13767
}
13868

139-
if (dateTime.IsYesterday())
69+
if (value is not DateTime dateTimeInput)
14070
{
141-
return InternalLocalizedStrings.Yesterday;
142-
}
143-
144-
if (dateTime.IsTomorrow())
145-
{
146-
return InternalLocalizedStrings.Tomorrow;
147-
}
148-
149-
var month = GetMonthBasedOnCulture(dateTime, culture);
150-
var day = GetDayBasedOnCulture(dateTime, culture);
151-
152-
if (culture.ThreeLetterWindowsLanguageName.Equals("ENU"))
153-
{
154-
return $"{month}{Space}{day}";
71+
throw new XamlParseException("The input has to be of type DateTime").WithXmlLineInfo(m_serviceProvider);
15572
}
15673

157-
return $"{day}{Space}{month}";
74+
return DateTimeFormatter.FormatDate(dateTimeInput, culture, IgnoreLocalTime, Format);
15875
}
15976

160-
private static string GetMonthBasedOnCulture(DateTime dateTime, CultureInfo culture)
77+
/// <inheritdoc />
78+
[ExcludeFromCodeCoverage]
79+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
16180
{
162-
var month = dateTime.ToString("MMM", culture);
163-
if (culture.TwoLetterISOLanguageName.Contains("en"))
164-
{
165-
month = month[0].ToString().ToUpper() + month.Substring(1);
166-
}
167-
168-
return month;
81+
throw new NotImplementedException();
16982
}
17083
}
17184
}

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

Lines changed: 8 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace DIPS.Xamarin.UI.Converters.ValueConverters
1414
/// </summary>
1515
public class TimeConverter : IMarkupExtension, IValueConverter
1616
{
17-
private IServiceProvider m_serviceProvider;
17+
private IServiceProvider? m_serviceProvider;
1818

1919
/// <summary>
2020
/// The converter format that is used to change the format of the time <see cref="TimeConverter" />
@@ -49,27 +49,17 @@ public object ProvideValue(IServiceProvider serviceProvider)
4949
/// <inheritdoc />
5050
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
5151
{
52-
var dateTimeInput = DateTime.MinValue;
53-
if (value == null) return string.Empty;
54-
if (!(value is DateTime) && !(value is TimeSpan))
55-
throw new XamlParseException("The input has to be of type DateTime or TimeSpan").WithXmlLineInfo(
56-
m_serviceProvider);
57-
58-
switch (value)
52+
if (value == null)
5953
{
60-
case TimeSpan timeSpanInput:
61-
dateTimeInput += timeSpanInput;
62-
break;
63-
case DateTime dateTimeValue:
64-
dateTimeInput = IgnoreLocalTime ? dateTimeValue : dateTimeValue.ToLocalTime();
65-
break;
54+
return string.Empty;
6655
}
6756

68-
return Format switch
57+
if (value is not DateTime && value is not TimeSpan)
6958
{
70-
TimeConverterFormat.Default => ConvertToDefaultFormat(dateTimeInput, culture),
71-
_ => string.Empty
72-
};
59+
throw new XamlParseException("The input has to be of type DateTime or TimeSpan").WithXmlLineInfo(m_serviceProvider);
60+
}
61+
62+
return DateTimeFormatter.FormatTime(value, culture, IgnoreLocalTime, Format);
7363
}
7464

7565
/// <inheritdoc />
@@ -78,23 +68,5 @@ public object ConvertBack(object value, Type targetType, object parameter, Cultu
7868
{
7969
throw new NotImplementedException();
8070
}
81-
82-
private static string ConvertToDefaultFormat(DateTime dateTimeInput, CultureInfo culture)
83-
{
84-
var time = dateTimeInput.ToString("HH:mm", culture);
85-
if (culture.IsNorwegian())
86-
{
87-
var hour = dateTimeInput.ToString("HH", culture);
88-
var minutes = dateTimeInput.ToString("mm", culture);
89-
time = $"{hour}:{minutes}";
90-
}
91-
92-
if (culture.ThreeLetterWindowsLanguageName.Equals("ENU"))
93-
{
94-
time = dateTimeInput.ToString("hh:mm tt", culture);
95-
}
96-
97-
return time;
98-
}
9971
}
10072
}

0 commit comments

Comments
 (0)