private void AssertBclNodaEquality(CultureInfo culture, string patternText) { // The BCL never seems to use abbreviated month genitive names. // I think it's reasonable that we do. Hmm. // See https://github.com/nodatime/nodatime/issues/377 if (patternText.Contains("MMM") && !patternText.Contains("MMMM") && culture.DateTimeFormat.AbbreviatedMonthGenitiveNames[SampleLocalDate.Month - 1] != culture.DateTimeFormat.AbbreviatedMonthNames[SampleLocalDate.Month - 1]) { return; } var pattern = LocalDatePattern.Create(patternText, culture); var calendarSystem = BclCalendars.CalendarSystemForCalendar(culture.Calendar); if (calendarSystem == null) { // We can't map this calendar system correctly yet; the test would be invalid. return; } var sampleDateInCalendar = SampleLocalDate.WithCalendar(calendarSystem); // To construct a DateTime, we need a time... let's give a non-midnight one to catch // any unexpected uses of time within the date patterns. DateTime sampleDateTime = (SampleLocalDate + new LocalTime(2, 3, 5)).ToDateTimeUnspecified(); Assert.AreEqual(sampleDateTime.ToString(patternText, culture), pattern.Format(sampleDateInCalendar)); }
public void ToStringBclEquality(CultureInfo culture) { // The BCL *sometimes* use the genitive month names for year/month, even though I don't // think it should. There may be more complexity here, but for the moment, we'll just skip the cultures we // expect to fail. (We would definitely want to know if new cultures started failing.) string[] expectedFailures = { "ast-ES", "ca-AD", "ca-ES", "ca-ES-valencia", "ca-FR", "ca-IT", "es-PE", "es-UY", "gl-ES", "oc-FR" }; if (expectedFailures.Contains(culture.Name)) { return; } Calendar calendar = culture.Calendar; var calendarSystem = BclCalendars.CalendarSystemForCalendar(calendar); if (calendarSystem is null) { // We can't map this calendar system correctly yet; the test would be invalid. return; } // Use the year/month containing "January 1st 2022 ISO" but in the target culture's calendar. var date = new LocalDate(2022, 1, 1).WithCalendar(calendarSystem); var yearMonth = date.ToYearMonth(); using (CultureSaver.SetCultures(culture)) { var bclText = date.ToDateTimeUnspecified().ToString(culture.DateTimeFormat.YearMonthPattern, culture); var nodaText1 = yearMonth.ToString(); var nodaText2 = yearMonth.ToString("G", culture); Assert.AreEqual(bclText, nodaText1); Assert.AreEqual(nodaText1, nodaText2); } }
private void AssertBclNodaEquality(CultureInfo culture, string patternText) { // On Mono, some general patterns include an offset at the end. For the moment, ignore them. // TODO(V1.2): Work out what to do in such cases... if ((patternText == "f" && culture.DateTimeFormat.ShortTimePattern.EndsWith("z")) || (patternText == "F" && culture.DateTimeFormat.FullDateTimePattern.EndsWith("z")) || (patternText == "g" && culture.DateTimeFormat.ShortTimePattern.EndsWith("z")) || (patternText == "G" && culture.DateTimeFormat.LongTimePattern.EndsWith("z"))) { return; } var pattern = CreatePatternOrNull(patternText, culture, LocalDateTimePattern.DefaultTemplateValue); if (pattern == null) { return; } // The BCL never seems to use abbreviated month genitive names. // I think it's reasonable that we do. Hmm. // See https://github.com/nodatime/nodatime/issues/377 if ((patternText == "G" || patternText == "g") && (culture.DateTimeFormat.ShortDatePattern.Contains("MMM") && !culture.DateTimeFormat.ShortDatePattern.Contains("MMMM")) && culture.DateTimeFormat.AbbreviatedMonthGenitiveNames[SampleLocalDateTime.Month - 1] != culture.DateTimeFormat.AbbreviatedMonthNames[SampleLocalDateTime.Month - 1]) { return; } // Formatting a DateTime with an always-invariant pattern (round-trip, sortable) converts to the ISO // calendar in .NET (which is reasonable, as there's no associated calendar). // We should use the Gregorian calendar for those tests. // However, on Mono (at least some versions) the round-trip format (o and O) is broken - it uses // the calendar of the culture instead of the ISO-8601 calendar. So for those cultures, // we'll skip round-trip format tests. // See https://bugzilla.xamarin.com/show_bug.cgi?id=11364 bool alwaysInvariantPattern = "Oos".Contains(patternText); if (alwaysInvariantPattern && TestHelper.IsRunningOnMono && !(culture.Calendar.GetType().Name == "GregorianCalendar")) { return; } Calendar calendar = alwaysInvariantPattern ? CultureInfo.InvariantCulture.Calendar : culture.Calendar; var calendarSystem = BclCalendars.CalendarSystemForCalendar(calendar); if (calendarSystem == null) { // We can't map this calendar system correctly yet; the test would be invalid. return; } // Use the sample date/time, but in the target culture's calendar system, as near as we can get. // We need to specify the right calendar system so that the days of week align properly. var inputValue = SampleLocalDateTime.WithCalendar(calendarSystem); Assert.AreEqual(inputValue.ToDateTimeUnspecified().ToString(patternText, culture), pattern.Format(inputValue)); }
public async Task <DateTimeOffset> ConvertToLocalAsync(DateTimeOffset dateTimeOffSet) { var localTimeZone = await GetLocalTimeZoneAsync(); var dateTimeZone = ((TimeZone)localTimeZone).DateTimeZone; var offsetDateTime = OffsetDateTime.FromDateTimeOffset(dateTimeOffSet); var currentCalendar = BclCalendars.GetCalendarByName(await _calendarManager.GetCurrentCalendar()); return(offsetDateTime.InZone(dateTimeZone).WithCalendar(currentCalendar).ToDateTimeOffset()); }