public ParseResult <Offset> ParsePartial(ValueCursor cursor)
            {
                int startIndex = cursor.Index;
                // TODO: Do better than this. It's horrible, and may well be invalid
                // for some cultures. Or just remove the NumberPattern from 2.0...
                int longestPossible = Math.Min(maxLength, cursor.Length - cursor.Index);

                for (int length = longestPossible; length >= 0; length--)
                {
                    string candidate = cursor.Value.Substring(cursor.Index, length);
                    int    milliseconds;
                    if (Int32.TryParse(candidate, NumberStyles.Integer | NumberStyles.AllowThousands,
                                       formatInfo.NumberFormat, out milliseconds))
                    {
                        if (milliseconds < -NodaConstants.MillisecondsPerStandardDay ||
                            NodaConstants.MillisecondsPerStandardDay < milliseconds)
                        {
                            cursor.Move(startIndex);
                            return(ParseResult <Offset> .ValueOutOfRange(cursor, milliseconds));
                        }
                        cursor.Move(cursor.Index + length);
                        return(ParseResult <Offset> .ForValue(Offset.FromMilliseconds(milliseconds)));
                    }
                }
                cursor.Move(startIndex);
                return(ParseResult <Offset> .CannotParseValue(cursor, "n"));
            }
            protected override ParseResult <Instant> ParseImpl(string value)
            {
                long number;

                if (Int64.TryParse(value, ParsingNumberStyles, FormatInfo.NumberFormat, out number))
                {
                    return(ParseResult <Instant> .ForValue(new Instant(number)));
                }
                return(ParseResult <Instant> .CannotParseValue(value, patternText));
            }
            public ParseResult <Offset> Parse(string text)
            {
                int milliseconds;

                if (Int32.TryParse(text, NumberStyles.Integer | NumberStyles.AllowThousands,
                                   formatInfo.NumberFormat, out milliseconds))
                {
                    if (milliseconds < -NodaConstants.MillisecondsPerStandardDay ||
                        NodaConstants.MillisecondsPerStandardDay < milliseconds)
                    {
                        return(ParseResult <Offset> .ValueOutOfRange(new ValueCursor(text), milliseconds));
                    }
                    return(ParseResult <Offset> .ForValue(Offset.FromMilliseconds(milliseconds)));
                }
                return(ParseResult <Offset> .CannotParseValue(new ValueCursor(text), "n"));
            }