Пример #1
0
        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));
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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));
        }
Пример #4
0
        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());
        }