Beispiel #1
0
 // Helper method to make it slightly easier for tests to skip "bad" cultures.
 private LocalDateTimePattern CreatePatternOrNull(string patternText, CultureInfo culture, LocalDateTime templateValue)
 {
     try
     {
         return(LocalDateTimePattern.Create(patternText, culture));
     }
     catch (InvalidPatternException)
     {
         // The Malta long date/time pattern in Mono 3.0 is invalid (not just wrong; invalid due to the wrong number of quotes).
         // Skip it :(
         // See https://bugzilla.xamarin.com/show_bug.cgi?id=11363
         return(null);
     }
 }
Beispiel #2
0
        public static bool ParseDateTime(this string text, DateTimeZone zone, string cultureTab, bool withoutDaylightSaving, MxCultureInfo.FormatType formatType, bool longFormat, out Instant result)
        {
            var rc = false;

            result = InstantError;

            if ((zone != null) && (String.IsNullOrEmpty(cultureTab) == false) && (formatType != MxCultureInfo.FormatType.Date) && (formatType != MxCultureInfo.FormatType.Time))
            {
                try
                {
                    var culture = MxCultureInfo.Instance.GetCultureInfo(cultureTab);
                    if (culture != null)
                    {
                        var parseResult = LocalDateTimePattern.Create(MxCultureInfo.GetFormatSpecifier(formatType, longFormat), MxCultureInfo.Instance.GetCultureInfo(cultureTab)).Parse(text);
                        //var temp = parseResult.Value;
                        if (parseResult.Success)
                        {
                            var instant = parseResult.Value.InZoneStrictly(zone).ToInstant();
                            var local   = instant.InZone(zone).LocalDateTime;
                            if (withoutDaylightSaving && zone.IsDaylightSavingsTime(instant))
                            {
                                local = local.Plus(Period.FromSeconds(zone.GetZoneInterval(instant).Savings.Seconds));
                            }

                            result = local.InZoneStrictly(zone).ToInstant();
                            rc     = true;
                        }
                    }
                }
                catch (Exception)
                {
                    //ignore
                }
            }
            return(rc);
        }
Beispiel #3
0
        /// <summary>
        /// Handles date, time and date/time embedded patterns.
        /// </summary>
        internal void AddEmbeddedLocalPartial(
            PatternCursor pattern,
            Func <TBucket, LocalDatePatternParser.LocalDateParseBucket> dateBucketExtractor,
            Func <TBucket, LocalTimePatternParser.LocalTimeParseBucket> timeBucketExtractor,
            Func <TResult, LocalDate> dateExtractor,
            Func <TResult, LocalTime> timeExtractor,
            // null if date/time embedded patterns are invalid
            Func <TResult, LocalDateTime>?dateTimeExtractor)
        {
            // This will be d (date-only), t (time-only), or < (date and time)
            // If it's anything else, we'll see the problem when we try to get the pattern.
            var patternType = pattern.PeekNext();

            if (patternType == 'd' || patternType == 't')
            {
                pattern.MoveNext();
            }
            string embeddedPatternText = pattern.GetEmbeddedPattern();

            switch (patternType)
            {
            case '<':
            {
                var sampleBucket = CreateSampleBucket();
                var templateTime = timeBucketExtractor(sampleBucket).TemplateValue;
                var templateDate = dateBucketExtractor(sampleBucket).TemplateValue;
                if (dateTimeExtractor is null)
                {
                    throw new InvalidPatternException(TextErrorMessages.InvalidEmbeddedPatternType);
                }
                AddField(PatternFields.EmbeddedDate, 'l');
                AddField(PatternFields.EmbeddedTime, 'l');
                AddEmbeddedPattern(
                    LocalDateTimePattern.Create(embeddedPatternText, FormatInfo, templateDate + templateTime).UnderlyingPattern,
                    (bucket, value) =>
                    {
                        var dateBucket                = dateBucketExtractor(bucket);
                        var timeBucket                = timeBucketExtractor(bucket);
                        dateBucket.Calendar           = value.Calendar;
                        dateBucket.Year               = value.Year;
                        dateBucket.MonthOfYearNumeric = value.Month;
                        dateBucket.DayOfMonth         = value.Day;
                        timeBucket.Hours24            = value.Hour;
                        timeBucket.Minutes            = value.Minute;
                        timeBucket.Seconds            = value.Second;
                        timeBucket.FractionalSeconds  = value.NanosecondOfSecond;
                    },
                    dateTimeExtractor);
                break;
            }

            case 'd':
                AddEmbeddedDatePattern('l', embeddedPatternText, dateBucketExtractor, dateExtractor);
                break;

            case 't':
                AddEmbeddedTimePattern('l', embeddedPatternText, timeBucketExtractor, timeExtractor);
                break;

            default:
                throw new InvalidOperationException("Bug in Noda Time: embedded pattern type wasn't date, time, or date+time");
            }
        }