示例#1
0
        public bool ParseDate(DateTimeParse parse, int start)
        {
            int year  = 0;
            int month = 0;
            int day   = 0;

            var result = (Parse4Digit(parse, start, out year) &&
                          1 <= year &&
                          ParseChar(parse, start + Lzyyyy, '-') &&
                          Parse2Digit(parse, start + Lzyyyy_, out month) &&
                          1 <= month &&
                          month <= 12 &&
                          ParseChar(parse, start + Lzyyyy_MM, '-') &&
                          Parse2Digit(parse, start + Lzyyyy_MM_, out day) &&
                          1 <= day &&
                          day <= DateTime.DaysInMonth(year, month));

            parse.Year  = year;
            parse.Month = month;
            parse.Day   = day;

            return(result);
        }
示例#2
0
        public DateTime CreateDateTime(DateTimeParse dateTimeParser)
        {
            bool is24Hour;

            if (dateTimeParser.Hour == 24)
            {
                is24Hour            = true;
                dateTimeParser.Hour = 0;
            }
            else
            {
                is24Hour = false;
            }

            DateTime d = new DateTime(dateTimeParser.Year, dateTimeParser.Month, dateTimeParser.Day, dateTimeParser.Hour, dateTimeParser.Minute, dateTimeParser.Second);

            d = d.AddTicks(dateTimeParser.Fraction);

            if (is24Hour)
            {
                d = d.AddDays(1);
            }
            return(d);
        }
示例#3
0
 public static DateTime ParseDateTimeExact(String value, String format, IFormatProvider provider, DateTimeStyles styles)
 {
     return(DateTimeParse.ParseExact(value, format, DateTimeFormatInfo.GetInstance(provider), styles));
 }
示例#4
0
 public static Boolean TryParseDateTimeExact(String value, String format, IFormatProvider provider, DateTimeStyles styles, out DateTime result)
 {
     return(DateTimeParse.TryParseExact(value, format, (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo)), styles, out result));
 }
示例#5
0
 public static DateTime ParseDateTimeExact(String value, String format, IFormatProvider provider, DateTimeStyles styles, out TimeSpan offset)
 {
     return(DateTimeParse.ParseExact(value, format, (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo)), styles, out offset));
 }
示例#6
0
 public static bool TryParseExact(ReadOnlySpan <char> s, string?[]?formats, IFormatProvider?provider, DateTimeStyles style, out DateTime result)
 {
     DateTimeFormatInfo.ValidateStyles(style, nameof(style));
     return(DateTimeParse.TryParseExactMultiple(s, formats, DateTimeFormatInfo.GetInstance(provider), style, out result));
 }
示例#7
0
 public static bool Parse(this DateTimeParse parse, char[] text, int startIndex, int length)
 {
     return(XDateTimes.Api.Parsing.Parse(parse, text, startIndex, length));
 }
示例#8
0
 public static bool Parse2Digit(this DateTimeParse parse, int start, out int num)
 {
     return(XDateTimes.Api.Parsing.Parse2Digit(parse, start, out num));
 }
示例#9
0
 public static bool ParseTimeAndZoneAndWhitespace(this DateTimeParse parse, int start)
 {
     return(XDateTimes.Api.Parsing.ParseTimeAndZoneAndWhitespace(parse, start));
 }
示例#10
0
 public bool ParseChar(DateTimeParse parse, int start, char ch)
 {
     return(start < parse.End && parse.Text[start] == ch);
 }
示例#11
0
        public bool ParseZone(DateTimeParse parse, int start)
        {
            if (start < parse.End)
            {
                char ch = parse.Text[start];
                if (ch == 'Z' || ch == 'z')
                {
                    parse.Zone = ParserTimeZone.Utc;
                    start++;
                }
                else
                {
                    int zoneHour = 0;

                    if (start + 2 < parse.End &&
                        Parse2Digit(parse, start + Lz_, out zoneHour) &&
                        zoneHour <= 99)
                    {
                        switch (ch)
                        {
                        case '-':
                            parse.Zone = ParserTimeZone.LocalWestOfUtc;
                            start     += Lz_zz;
                            break;

                        case '+':
                            parse.Zone = ParserTimeZone.LocalEastOfUtc;
                            start     += Lz_zz;
                            break;
                        }
                    }

                    if (start < parse.End)
                    {
                        int zoneMinute = 0;

                        if (ParseChar(parse, start, ':'))
                        {
                            start += 1;

                            if (start + 1 < parse.End &&
                                Parse2Digit(parse, start, out zoneMinute) &&
                                zoneMinute <= 99)
                            {
                                start += 2;
                            }
                        }
                        else
                        {
                            if (start + 1 < parse.End &&
                                Parse2Digit(parse, start, out zoneMinute) &&
                                zoneMinute <= 99)
                            {
                                start += 2;
                            }
                        }

                        parse.ZoneMinute = zoneMinute;
                    }
                }
            }

            return(start == parse.End);
        }
示例#12
0
        public bool TryParseDateTimeIso(StringReference text, DateTimeZoneHandling dateTimeZoneHandling, out DateTime dt)
        {
            DateTimeParse dateTimeParser = new DateTimeParse();

            if (!dateTimeParser.Parse(text.Chars, text.StartIndex, text.Length))
            {
                dt = default(DateTime);

                return(false);
            }

            DateTime d = CreateDateTime(dateTimeParser);

            long ticks;

            switch (dateTimeParser.Zone)
            {
            case ParserTimeZone.Utc:
                d = new DateTime(d.Ticks, DateTimeKind.Utc);
                break;

            case ParserTimeZone.LocalWestOfUtc:
            {
                TimeSpan offset = new TimeSpan(dateTimeParser.ZoneHour, dateTimeParser.ZoneMinute, 0);
                ticks = d.Ticks + offset.Ticks;
                if (ticks <= DateTime.MaxValue.Ticks)
                {
                    d = new DateTime(ticks, DateTimeKind.Utc).ToLocalTime();
                }
                else
                {
                    ticks += d.GetUtcOffset().Ticks;
                    if (ticks > DateTime.MaxValue.Ticks)
                    {
                        ticks = DateTime.MaxValue.Ticks;
                    }

                    d = new DateTime(ticks, DateTimeKind.Local);
                }
                break;
            }

            case ParserTimeZone.LocalEastOfUtc:
            {
                TimeSpan offset = new TimeSpan(dateTimeParser.ZoneHour, dateTimeParser.ZoneMinute, 0);
                ticks = d.Ticks - offset.Ticks;
                if (ticks >= DateTime.MinValue.Ticks)
                {
                    d = new DateTime(ticks, DateTimeKind.Utc).ToLocalTime();
                }
                else
                {
                    ticks += d.GetUtcOffset().Ticks;
                    if (ticks < DateTime.MinValue.Ticks)
                    {
                        ticks = DateTime.MinValue.Ticks;
                    }

                    d = new DateTime(ticks, DateTimeKind.Local);
                }
                break;
            }
            }

            dt = EnsureDateTime(d, dateTimeZoneHandling);
            return(true);
        }
示例#13
0
 public static Boolean TryParseDateTimeExactMultiple(String value, String[] formats, IFormatProvider provider, DateTimeStyles styles, out DateTime result)
 {
     return(DateTimeParse.TryParseExactMultiple(value, formats, DateTimeFormatInfo.GetInstance(provider), styles, out result));
 }
示例#14
0
 public static Boolean TryParseDateTimeExact(String value, String format, IFormatProvider provider, DateTimeStyles styles, out DateTime result, out TimeSpan offset)
 {
     return(DateTimeParse.TryParseExact(value, format, DateTimeFormatInfo.GetInstance(provider), styles, out result, out offset));
 }
示例#15
0
 public static DateTime ParseDateTimeExactMultiple(String value, String[] formats, IFormatProvider provider, DateTimeStyles styles, out TimeSpan offset)
 {
     return(DateTimeParse.ParseExactMultiple(value, formats, DateTimeFormatInfo.GetInstance(provider), styles, out offset));
 }
示例#16
0
 public static DateTime2 ParseExact(string s, string format, IFormatProvider provider)
 {
     return(DateTimeParse.ParseExact(s, format, DateTimeFormatInfo.GetInstance(provider), DateTimeStyles.None));
 }
示例#17
0
 public static DateTime2 ParseExact(string s, string[] formats, IFormatProvider provider, DateTimeStyles style)
 {
     DateTimeFormatInfo.ValidateStyles(style, "style");
     return(DateTimeParse.ParseExactMultiple(s, formats, DateTimeFormatInfo.GetInstance(provider), style));
 }
示例#18
0
 public bool ParseTimeAndZoneAndWhitespace(DateTimeParse parse, int start)
 {
     return(ParseTime(parse, ref start) && ParseZone(parse, start));
 }
示例#19
0
 public static bool ParseZone(this DateTimeParse parse, int start)
 {
     return(XDateTimes.Api.Parsing.ParseZone(parse, start));
 }
示例#20
0
        public bool ParseTime(DateTimeParse parse, ref int start)
        {
            int hour   = 0;
            int minute = 0;
            int second = 0;

            if (!(Parse2Digit(parse, start, out hour) &&
                  hour <= 24 &&
                  ParseChar(parse, start + LzHH, ':') &&
                  Parse2Digit(parse, start + LzHH_, out minute) &&
                  minute < 60 &&
                  ParseChar(parse, start + LzHH_mm, ':') &&
                  Parse2Digit(parse, start + LzHH_mm_, out second) &&
                  second < 60 &&
                  (hour != 24 || (minute == 0 && second == 0))))    // hour can be 24 if minute/second is zero)
            {
                parse.Hour   = hour;
                parse.Minute = minute;
                parse.Second = second;

                return(false);
            }

            parse.Hour   = hour;
            parse.Minute = minute;
            parse.Second = second;

            start += LzHH_mm_ss;
            if (ParseChar(parse, start, '.'))
            {
                parse.Fraction = 0;
                int numberOfDigits = 0;

                while (++start < parse.End && numberOfDigits < MaxFractionDigits)
                {
                    int digit = parse.Text[start] - '0';
                    if (digit < 0 || digit > 9)
                    {
                        break;
                    }

                    parse.Fraction = (parse.Fraction * 10) + digit;

                    numberOfDigits++;
                }

                if (numberOfDigits < MaxFractionDigits)
                {
                    if (numberOfDigits == 0)
                    {
                        return(false);
                    }

                    parse.Fraction *= Power10[MaxFractionDigits - numberOfDigits];
                }

                if (parse.Hour == 24 && parse.Fraction != 0)
                {
                    return(false);
                }
            }
            return(true);
        }
示例#21
0
 public static bool ParseChar(this DateTimeParse parse, int start, char ch)
 {
     return(XDateTimes.Api.Parsing.ParseChar(parse, start, ch));
 }
示例#22
0
 public static bool TryParse(string s, out DateTime2 result)
 {
     return(DateTimeParse.TryParse(s, DateTimeFormatInfo.CurrentInfo, DateTimeStyles.None, out result));
 }
示例#23
0
 public static bool TryParse(ReadOnlySpan <char> s, IFormatProvider?provider, DateTimeStyles styles, out DateTime result)
 {
     DateTimeFormatInfo.ValidateStyles(styles, nameof(styles));
     return(DateTimeParse.TryParse(s, DateTimeFormatInfo.GetInstance(provider), styles, out result));
 }
示例#24
0
 public static bool TryParseExact(string s, string format, IFormatProvider provider, DateTimeStyles style, out DateTime2 result)
 {
     DateTimeFormatInfo.ValidateStyles(style, "style");
     return(DateTimeParse.TryParseExact(s, format, DateTimeFormatInfo.GetInstance(provider), style, out result));
 }
示例#25
0
 public static DateTime ParseDateTime(String value, IFormatProvider provider, DateTimeStyles styles)
 {
     return(DateTimeParse.Parse(value, (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo)), styles));
 }
示例#26
0
 public static DateTime2 Parse(string s)
 {
     return(DateTimeParse.Parse(s, DateTimeFormatInfo.CurrentInfo, DateTimeStyles.None));
 }
示例#27
0
 public static DateTime ParseDateTimeExactMultiple(String value, String[] formats, IFormatProvider provider, DateTimeStyles styles)
 {
     return(DateTimeParse.ParseExactMultiple(value, formats, (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo)), styles));
 }
示例#28
0
 public static DateTime2 Parse(string s, IFormatProvider provider, DateTimeStyles styles)
 {
     DateTimeFormatInfo.ValidateStyles(styles, "styles");
     return(DateTimeParse.Parse(s, DateTimeFormatInfo.GetInstance(provider), styles));
 }
示例#29
0
 public static Boolean TryParseDateTimeExactMultiple(String value, String[] formats, IFormatProvider provider, DateTimeStyles styles, out DateTime result, out TimeSpan offset)
 {
     return(DateTimeParse.TryParseExactMultiple(value, formats, (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo)), styles, out result, out offset));
 }
示例#30
0
 public static DateTime ParseDateTime(String value, IFormatProvider provider, DateTimeStyles styles, out TimeSpan offset)
 {
     return(DateTimeParse.Parse(value, DateTimeFormatInfo.GetInstance(provider), styles, out offset));
 }