本文整理汇总了C#中System.__DTString.SkipWhiteSpaces方法的典型用法代码示例。如果您正苦于以下问题:C# __DTString.SkipWhiteSpaces方法的具体用法?C# __DTString.SkipWhiteSpaces怎么用?C# __DTString.SkipWhiteSpaces使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类System.__DTString
的用法示例。
在下文中一共展示了__DTString.SkipWhiteSpaces方法的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: DoStrictParse
private static bool DoStrictParse(string s, string formatParam, DateTimeStyles styles, DateTimeFormatInfo dtfi, ref DateTimeResult result)
{
ParsingInfo parsingInfo = default(ParsingInfo);
parsingInfo.Init();
parsingInfo.calendar = dtfi.Calendar;
parsingInfo.fAllowInnerWhite = ((styles & DateTimeStyles.AllowInnerWhite) != DateTimeStyles.None);
parsingInfo.fAllowTrailingWhite = ((styles & DateTimeStyles.AllowTrailingWhite) != DateTimeStyles.None);
if (formatParam.Length == 1)
{
if ((result.flags & ParseFlags.CaptureOffset) != (ParseFlags)0 && formatParam[0] == 'U')
{
result.SetFailure(ParseFailureKind.Format, "Format_BadFormatSpecifier", null);
return false;
}
formatParam = DateTimeParse.ExpandPredefinedFormat(formatParam, ref dtfi, ref parsingInfo, ref result);
}
result.calendar = parsingInfo.calendar;
if (parsingInfo.calendar.ID == 8)
{
parsingInfo.parseNumberDelegate = DateTimeParse.m_hebrewNumberParser;
parsingInfo.fCustomNumberParser = true;
}
result.Hour = (result.Minute = (result.Second = -1));
__DTString _DTString = new __DTString(formatParam, dtfi, false);
__DTString _DTString2 = new __DTString(s, dtfi, false);
if (parsingInfo.fAllowTrailingWhite)
{
_DTString.TrimTail();
_DTString.RemoveTrailingInQuoteSpaces();
_DTString2.TrimTail();
}
if ((styles & DateTimeStyles.AllowLeadingWhite) != DateTimeStyles.None)
{
_DTString.SkipWhiteSpaces();
_DTString.RemoveLeadingInQuoteSpaces();
_DTString2.SkipWhiteSpaces();
}
while (_DTString.GetNext())
{
if (parsingInfo.fAllowInnerWhite)
{
_DTString2.SkipWhiteSpaces();
}
if (!DateTimeParse.ParseByFormat(ref _DTString2, ref _DTString, ref parsingInfo, dtfi, ref result))
{
return false;
}
}
if (_DTString2.Index < _DTString2.Value.Length - 1)
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (parsingInfo.fUseTwoDigitYear && (dtfi.FormatFlags & DateTimeFormatFlags.UseHebrewRule) == DateTimeFormatFlags.None)
{
if (result.Year >= 100)
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
result.Year = parsingInfo.calendar.ToFourDigitYear(result.Year);
}
if (parsingInfo.fUseHour12)
{
if (parsingInfo.timeMark == DateTimeParse.TM.NotSet)
{
parsingInfo.timeMark = DateTimeParse.TM.AM;
}
if (result.Hour > 12)
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (parsingInfo.timeMark == DateTimeParse.TM.AM)
{
if (result.Hour == 12)
{
result.Hour = 0;
}
}
else
{
result.Hour = ((result.Hour == 12) ? 12 : (result.Hour + 12));
}
}
else
{
if ((parsingInfo.timeMark == DateTimeParse.TM.AM && result.Hour >= 12) || (parsingInfo.timeMark == DateTimeParse.TM.PM && result.Hour < 12))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
bool flag = result.Year == -1 && result.Month == -1 && result.Day == -1;
if (!DateTimeParse.CheckDefaultDateTime(ref result, ref parsingInfo.calendar, styles))
{
return false;
}
if (!flag && dtfi.HasYearMonthAdjustment && !dtfi.YearMonthAdjustment(ref result.Year, ref result.Month, (result.flags & ParseFlags.ParsedMonthName) != (ParseFlags)0))
{
//.........这里部分代码省略.........
示例2: ParseISO8601
private static bool ParseISO8601(ref DateTimeRawInfo raw, ref __DTString str, DateTimeStyles styles, ref DateTimeResult result)
{
if (raw.year >= 0 && raw.GetNumber(0) >= 0)
{
raw.GetNumber(1);
}
str.Index--;
int second = 0;
double num = 0.0;
str.SkipWhiteSpaces();
int hour;
if (!DateTimeParse.ParseDigits(ref str, 2, out hour))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.SkipWhiteSpaces();
if (!str.Match(':'))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.SkipWhiteSpaces();
int minute;
if (!DateTimeParse.ParseDigits(ref str, 2, out minute))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.SkipWhiteSpaces();
if (str.Match(':'))
{
str.SkipWhiteSpaces();
if (!DateTimeParse.ParseDigits(ref str, 2, out second))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (str.Match('.'))
{
if (!DateTimeParse.ParseFraction(ref str, out num))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.Index--;
}
str.SkipWhiteSpaces();
}
if (str.GetNext())
{
char @char = str.GetChar();
if (@char == '+' || @char == '-')
{
result.flags |= ParseFlags.TimeZoneUsed;
if (!DateTimeParse.ParseTimeZone(ref str, ref result.timeZoneOffset))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
else
{
if (@char == 'Z' || @char == 'z')
{
result.flags |= ParseFlags.TimeZoneUsed;
result.timeZoneOffset = TimeSpan.Zero;
result.flags |= ParseFlags.TimeZoneUtc;
}
else
{
str.Index--;
}
}
str.SkipWhiteSpaces();
if (str.Match('#'))
{
if (!DateTimeParse.VerifyValidPunctuation(ref str))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.SkipWhiteSpaces();
}
if (str.Match('\0') && !DateTimeParse.VerifyValidPunctuation(ref str))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (str.GetNext())
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
Calendar defaultInstance = GregorianCalendar.GetDefaultInstance();
DateTime parsedDate;
if (!defaultInstance.TryToDateTime(raw.year, raw.GetNumber(0), raw.GetNumber(1), hour, minute, second, 0, result.era, out parsedDate))
{
result.SetFailure(ParseFailureKind.FormatBadDateTimeCalendar, "Format_BadDateTimeCalendar", null);
//.........这里部分代码省略.........
示例3: ParseByFormat
private static bool ParseByFormat(ref __DTString str, ref __DTString format, ref ParsingInfo parseInfo, DateTimeFormatInfo dtfi, ref DateTimeResult result)
{
int num = 0;
int newValue = 0;
int newValue2 = 0;
int newValue3 = 0;
int newValue4 = 0;
int newValue5 = 0;
int newValue6 = 0;
int newValue7 = 0;
double num2 = 0.0;
DateTimeParse.TM tM = DateTimeParse.TM.AM;
char @char = format.GetChar();
char c = @char;
if (c <= 'H')
{
if (c <= '\'')
{
if (c != '"')
{
switch (c)
{
case '%':
{
if (format.Index >= format.Value.Length - 1 || format.Value[format.Index + 1] == '%')
{
result.SetFailure(ParseFailureKind.Format, "Format_BadFormatSpecifier", null);
return false;
}
return true;
}
case '&':
{
goto IL_991;
}
case '\'':
{
break;
}
default:
{
goto IL_991;
}
}
}
StringBuilder stringBuilder = new StringBuilder();
if (!DateTimeParse.TryParseQuoteString(format.Value, format.Index, stringBuilder, out num))
{
result.SetFailure(ParseFailureKind.FormatWithParameter, "Format_BadQuote", @char);
return false;
}
format.Index += num - 1;
string text = stringBuilder.ToString();
for (int i = 0; i < text.Length; i++)
{
if (text[i] == ' ' && parseInfo.fAllowInnerWhite)
{
str.SkipWhiteSpaces();
}
else
{
if (!str.Match(text[i]))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
}
if ((result.flags & ParseFlags.CaptureOffset) == (ParseFlags)0)
{
return true;
}
if ((result.flags & ParseFlags.Rfc1123Pattern) != (ParseFlags)0 && text == "GMT")
{
result.flags |= ParseFlags.TimeZoneUsed;
result.timeZoneOffset = TimeSpan.Zero;
return true;
}
if ((result.flags & ParseFlags.UtcSortPattern) != (ParseFlags)0 && text == "Z")
{
result.flags |= ParseFlags.TimeZoneUsed;
result.timeZoneOffset = TimeSpan.Zero;
return true;
}
return true;
}
else
{
switch (c)
{
case '.':
{
if (str.Match(@char))
{
return true;
}
if (format.GetNext() && format.Match('F'))
{
format.GetRepeatCount();
return true;
//.........这里部分代码省略.........
示例4: ParseByFormat
//.........这里部分代码省略.........
// A time separator is expected.
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
break;
case '/':
// We match the separator in date pattern with the character in the date string if both equal to '/' or the date separator is matching the characters in the date string
// We have to exclude the case when the date separator is more than one character and starts with '/' something like "//" for instance.
if (((dtfi.DateSeparator.Length > 1 && dtfi.DateSeparator[0] == '/') || !str.Match('/')) &&
!str.Match(dtfi.DateSeparator))
{
// A date separator is expected.
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
break;
case '\"':
case '\'':
StringBuilder enquotedString = new StringBuilder();
// Use ParseQuoteString so that we can handle escape characters within the quoted string.
if (!TryParseQuoteString(format.Value, format.Index, enquotedString, out tokenLen)) {
result.SetFailure(ParseFailureKind.FormatWithParameter, "Format_BadQuote", ch);
return (false);
}
format.Index += tokenLen - 1;
// Some cultures uses space in the quoted string. E.g. Spanish has long date format as:
// "dddd, dd' de 'MMMM' de 'yyyy". When inner spaces flag is set, we should skip whitespaces if there is space
// in the quoted string.
String quotedStr = enquotedString.ToString();
for (int i = 0; i < quotedStr.Length; i++) {
if (quotedStr[i] == ' ' && parseInfo.fAllowInnerWhite) {
str.SkipWhiteSpaces();
} else if (!str.Match(quotedStr[i])) {
// Can not find the matching quoted string.
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
// The "r" and "u" formats incorrectly quoted 'GMT' and 'Z', respectively. We cannot
// correct this mistake for DateTime.ParseExact for compatibility reasons, but we can
// fix it for DateTimeOffset.ParseExact as DateTimeOffset has not been publically released
// with this issue.
if ((result.flags & ParseFlags.CaptureOffset) != 0) {
if ((result.flags & ParseFlags.Rfc1123Pattern) != 0 && quotedStr == GMTName) {
result.flags |= ParseFlags.TimeZoneUsed;
result.timeZoneOffset = TimeSpan.Zero;
}
else if ((result.flags & ParseFlags.UtcSortPattern) != 0 && quotedStr == ZuluName) {
result.flags |= ParseFlags.TimeZoneUsed;
result.timeZoneOffset = TimeSpan.Zero;
}
}
break;
case '%':
// Skip this so we can get to the next pattern character.
// Used in case like "%d", "%y"
// Make sure the next character is not a '%' again.
if (format.Index >= format.Value.Length - 1 || format.Value[format.Index + 1] == '%') {
result.SetFailure(ParseFailureKind.Format, "Format_BadFormatSpecifier", null);
return false;
}
示例5: DoStrictParse
/*=================================DoStrictParse==================================
**Action: Do DateTime parsing using the format in formatParam.
**Returns: The parsed DateTime.
**Arguments:
**Exceptions:
**
**Notes:
** When the following general formats are used, InvariantInfo is used in dtfi:
** 'r', 'R', 's'.
** When the following general formats are used, the time is assumed to be in Universal time.
**
**Limitations:
** Only GregarianCalendar is supported for now.
** Only support GMT timezone.
==============================================================================*/
private static bool DoStrictParse(
String s,
String formatParam,
DateTimeStyles styles,
DateTimeFormatInfo dtfi,
ref DateTimeResult result) {
ParsingInfo parseInfo = new ParsingInfo();
parseInfo.Init();
parseInfo.calendar = dtfi.Calendar;
parseInfo.fAllowInnerWhite = ((styles & DateTimeStyles.AllowInnerWhite) != 0);
parseInfo.fAllowTrailingWhite = ((styles & DateTimeStyles.AllowTrailingWhite) != 0);
// We need the original values of the following two below.
String originalFormat = formatParam;
if (formatParam.Length == 1) {
if (((result.flags & ParseFlags.CaptureOffset) != 0) && formatParam[0] == 'U') {
// The 'U' format is not allowed for DateTimeOffset
result.SetFailure(ParseFailureKind.Format, "Format_BadFormatSpecifier", null);
return false;
}
formatParam = ExpandPredefinedFormat(formatParam, ref dtfi, ref parseInfo, ref result);
}
bool bTimeOnly = false;
result.calendar = parseInfo.calendar;
if (parseInfo.calendar.ID == Calendar.CAL_HEBREW) {
parseInfo.parseNumberDelegate = m_hebrewNumberParser;
parseInfo.fCustomNumberParser = true;
}
// Reset these values to negative one so that we could throw exception
// if we have parsed every item twice.
result.Hour = result.Minute = result.Second = -1;
__DTString format = new __DTString(formatParam, dtfi, false);
__DTString str = new __DTString(s, dtfi, false);
if (parseInfo.fAllowTrailingWhite) {
// Trim trailing spaces if AllowTrailingWhite.
format.TrimTail();
format.RemoveTrailingInQuoteSpaces();
str.TrimTail();
}
if ((styles & DateTimeStyles.AllowLeadingWhite) != 0) {
format.SkipWhiteSpaces();
format.RemoveLeadingInQuoteSpaces();
str.SkipWhiteSpaces();
}
//
// Scan every character in format and match the pattern in str.
//
while (format.GetNext()) {
// We trim inner spaces here, so that we will not eat trailing spaces when
// AllowTrailingWhite is not used.
if (parseInfo.fAllowInnerWhite) {
str.SkipWhiteSpaces();
}
if (!ParseByFormat(ref str, ref format, ref parseInfo, dtfi, ref result)) {
return (false);
}
}
if (str.Index < str.Value.Length - 1) {
// There are still remaining character in str.
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (parseInfo.fUseTwoDigitYear && ((dtfi.FormatFlags & DateTimeFormatFlags.UseHebrewRule) == 0)) {
// A two digit year value is expected. Check if the parsed year value is valid.
if (result.Year >= 100) {
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
try {
result.Year = parseInfo.calendar.ToFourDigitYear(result.Year);
//.........这里部分代码省略.........
示例6: DoStrictParse
private static bool DoStrictParse(string s, string formatParam, DateTimeStyles styles, DateTimeFormatInfo dtfi, ref DateTimeResult result)
{
bool bTimeOnly = false;
ParsingInfo parseInfo = new ParsingInfo();
parseInfo.Init();
parseInfo.calendar = dtfi.Calendar;
parseInfo.fAllowInnerWhite = (styles & DateTimeStyles.AllowInnerWhite) != DateTimeStyles.None;
parseInfo.fAllowTrailingWhite = (styles & DateTimeStyles.AllowTrailingWhite) != DateTimeStyles.None;
if (formatParam.Length == 1)
{
if (((result.flags & ParseFlags.CaptureOffset) != 0) && (formatParam[0] == 'U'))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadFormatSpecifier", null);
return false;
}
formatParam = ExpandPredefinedFormat(formatParam, ref dtfi, ref parseInfo, ref result);
}
result.calendar = parseInfo.calendar;
if (parseInfo.calendar.ID == 8)
{
parseInfo.parseNumberDelegate = m_hebrewNumberParser;
parseInfo.fCustomNumberParser = true;
}
result.Hour = result.Minute = result.Second = -1;
__DTString format = new __DTString(formatParam, dtfi, false);
__DTString str = new __DTString(s, dtfi, false);
if (parseInfo.fAllowTrailingWhite)
{
format.TrimTail();
format.RemoveTrailingInQuoteSpaces();
str.TrimTail();
}
if ((styles & DateTimeStyles.AllowLeadingWhite) != DateTimeStyles.None)
{
format.SkipWhiteSpaces();
format.RemoveLeadingInQuoteSpaces();
str.SkipWhiteSpaces();
}
while (format.GetNext())
{
if (parseInfo.fAllowInnerWhite)
{
str.SkipWhiteSpaces();
}
if (!ParseByFormat(ref str, ref format, ref parseInfo, dtfi, ref result))
{
return false;
}
}
if (str.Index < (str.Value.Length - 1))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (parseInfo.fUseTwoDigitYear && ((dtfi.FormatFlags & DateTimeFormatFlags.UseHebrewRule) == DateTimeFormatFlags.None))
{
if (result.Year >= 100)
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
result.Year = parseInfo.calendar.ToFourDigitYear(result.Year);
}
if (parseInfo.fUseHour12)
{
if (parseInfo.timeMark == TM.NotSet)
{
parseInfo.timeMark = TM.AM;
}
if (result.Hour > 12)
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (parseInfo.timeMark == TM.AM)
{
if (result.Hour == 12)
{
result.Hour = 0;
}
}
else
{
result.Hour = (result.Hour == 12) ? 12 : (result.Hour + 12);
}
}
bTimeOnly = ((result.Year == -1) && (result.Month == -1)) && (result.Day == -1);
if (!CheckDefaultDateTime(ref result, ref parseInfo.calendar, styles))
{
return false;
}
if ((!bTimeOnly && dtfi.HasYearMonthAdjustment) && !dtfi.YearMonthAdjustment(ref result.Year, ref result.Month, (result.flags & ParseFlags.ParsedMonthName) != 0))
{
result.SetFailure(ParseFailureKind.FormatBadDateTimeCalendar, "Format_BadDateTimeCalendar", null);
return false;
}
if (!parseInfo.calendar.TryToDateTime(result.Year, result.Month, result.Day, result.Hour, result.Minute, result.Second, 0, result.era, out result.parsedDate))
{
result.SetFailure(ParseFailureKind.FormatBadDateTimeCalendar, "Format_BadDateTimeCalendar", null);
return false;
//.........这里部分代码省略.........
示例7: ParseISO8601
//
// Parse the ISO8601 format string found during Parse();
//
//
private static bool ParseISO8601(ref DateTimeRawInfo raw, ref __DTString str, DateTimeStyles styles, ref DateTimeResult result) {
if (raw.year < 0 || raw.GetNumber(0) < 0 || raw.GetNumber(1) < 0) {
}
str.Index--;
int hour, minute;
int second = 0;
double partSecond = 0;
str.SkipWhiteSpaces();
if (!ParseDigits(ref str, 2, out hour)) {
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.SkipWhiteSpaces();
if (!str.Match(':')) {
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.SkipWhiteSpaces();
if (!ParseDigits(ref str, 2, out minute)) {
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.SkipWhiteSpaces();
if (str.Match(':')) {
str.SkipWhiteSpaces();
if (!ParseDigits(ref str, 2, out second)) {
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (str.Match('.')) {
if (!ParseFraction(ref str, out partSecond)) {
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.Index--;
}
str.SkipWhiteSpaces();
}
if (str.GetNext()) {
char ch = str.GetChar();
if (ch == '+' || ch == '-') {
result.flags |= ParseFlags.TimeZoneUsed;
if (!ParseTimeZone(ref str, ref result.timeZoneOffset)) {
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
} else if (ch == 'Z' || ch == 'z') {
result.flags |= ParseFlags.TimeZoneUsed;
result.timeZoneOffset = TimeSpan.Zero;
result.flags |= ParseFlags.TimeZoneUtc;
} else {
str.Index--;
}
str.SkipWhiteSpaces();
if (str.Match('#')) {
if (!VerifyValidPunctuation(ref str)) {
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.SkipWhiteSpaces();
}
if (str.Match('\0')) {
if (!VerifyValidPunctuation(ref str)) {
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
if (str.GetNext()) {
// If this is true, there were non-white space characters remaining in the DateTime
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
DateTime time;
Calendar calendar = GregorianCalendar.GetDefaultInstance();
if (!calendar.TryToDateTime(raw.year, raw.GetNumber(0), raw.GetNumber(1),
hour, minute, second, 0, result.era, out time)) {
result.SetFailure(ParseFailureKind.FormatBadDateTimeCalendar, "Format_BadDateTimeCalendar", null);
return false;
}
time = time.AddTicks((long)Math.Round(partSecond * Calendar.TicksPerSecond));
result.parsedDate = time;
if (!DetermineTimeZoneAdjustments(ref result, styles, false)) {
return false;
}
return true;
}
示例8: ParseISO8601
private static bool ParseISO8601(ref DateTimeRawInfo raw, ref __DTString str, DateTimeStyles styles, ref DateTimeResult result)
{
int num;
int num2;
DateTime time;
if ((raw.year >= 0) && (raw.GetNumber(0) >= 0))
{
raw.GetNumber(1);
}
str.Index--;
int num3 = 0;
double num4 = 0.0;
str.SkipWhiteSpaces();
if (!ParseDigits(ref str, 2, out num))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.SkipWhiteSpaces();
if (!str.Match(':'))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.SkipWhiteSpaces();
if (!ParseDigits(ref str, 2, out num2))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.SkipWhiteSpaces();
if (str.Match(':'))
{
str.SkipWhiteSpaces();
if (!ParseDigits(ref str, 2, out num3))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (str.Match('.'))
{
if (!ParseFraction(ref str, out num4))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.Index--;
}
str.SkipWhiteSpaces();
}
if (str.GetNext())
{
switch (str.GetChar())
{
case '+':
case '-':
result.flags |= ParseFlags.TimeZoneUsed;
if (!ParseTimeZone(ref str, ref result.timeZoneOffset))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
break;
case 'Z':
case 'z':
result.flags |= ParseFlags.TimeZoneUsed;
result.timeZoneOffset = TimeSpan.Zero;
result.flags |= ParseFlags.TimeZoneUtc;
break;
default:
str.Index--;
break;
}
str.SkipWhiteSpaces();
if (str.Match('#'))
{
if (!VerifyValidPunctuation(ref str))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.SkipWhiteSpaces();
}
if (str.Match('\0') && !VerifyValidPunctuation(ref str))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (str.GetNext())
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
if (!GregorianCalendar.GetDefaultInstance().TryToDateTime(raw.year, raw.GetNumber(0), raw.GetNumber(1), num, num2, num3, 0, result.era, out time))
{
result.SetFailure(ParseFailureKind.FormatBadDateTimeCalendar, "Format_BadDateTimeCalendar", null);
return false;
//.........这里部分代码省略.........
示例9: ParseByFormat
private static bool ParseByFormat(ref __DTString str, ref __DTString format, ref ParsingInfo parseInfo, DateTimeFormatInfo dtfi, ref DateTimeResult result)
{
bool flag;
int returnValue = 0;
int num2 = 0;
int num3 = 0;
int num4 = 0;
int num5 = 0;
int num6 = 0;
int num7 = 0;
int num8 = 0;
double num9 = 0.0;
TM aM = TM.AM;
char failureMessageFormatArgument = format.GetChar();
switch (failureMessageFormatArgument)
{
case '%':
if ((format.Index < (format.Value.Length - 1)) && (format.Value[format.Index + 1] != '%'))
{
goto Label_0A5A;
}
result.SetFailure(ParseFailureKind.Format, "Format_BadFormatSpecifier", null);
return false;
case '\'':
case '"':
{
StringBuilder builder = new StringBuilder();
if (!TryParseQuoteString(format.Value, format.Index, builder, out returnValue))
{
result.SetFailure(ParseFailureKind.FormatWithParameter, "Format_BadQuote", failureMessageFormatArgument);
return false;
}
format.Index += returnValue - 1;
string str2 = builder.ToString();
for (int i = 0; i < str2.Length; i++)
{
if ((str2[i] == ' ') && parseInfo.fAllowInnerWhite)
{
str.SkipWhiteSpaces();
}
else if (!str.Match(str2[i]))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
if ((result.flags & ParseFlags.CaptureOffset) != 0)
{
if (((result.flags & ParseFlags.Rfc1123Pattern) != 0) && (str2 == "GMT"))
{
result.flags |= ParseFlags.TimeZoneUsed;
result.timeZoneOffset = TimeSpan.Zero;
}
else if (((result.flags & ParseFlags.UtcSortPattern) != 0) && (str2 == "Z"))
{
result.flags |= ParseFlags.TimeZoneUsed;
result.timeZoneOffset = TimeSpan.Zero;
}
}
goto Label_0A5A;
}
case '.':
if (!str.Match(failureMessageFormatArgument))
{
if (!format.GetNext() || !format.Match('F'))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
format.GetRepeatCount();
}
goto Label_0A5A;
case '/':
if (str.Match(dtfi.DateSeparator))
{
goto Label_0A5A;
}
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
case ':':
if (str.Match(dtfi.TimeSeparator))
{
goto Label_0A5A;
}
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
case 'F':
case 'f':
returnValue = format.GetRepeatCount();
if (returnValue <= 7)
{
if (!ParseFractionExact(ref str, returnValue, ref num9) && (failureMessageFormatArgument == 'f'))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
//.........这里部分代码省略.........
示例10: DoStrictParse
/*=================================DoStrictParse==================================
**Action: Do DateTime parsing using the format in formatParam.
**Returns: The parsed DateTime.
**Arguments:
**Exceptions:
**
**Notes:
** When the following general formats are used, InvariantInfo is used in dtfi:
** 'r', 'R', 's'.
** When the following general formats are used, the time is assumed to be in Universal time.
**
**Limitations:
** Only GregarianCalendar is supported for now.
** Only support GMT timezone.
==============================================================================*/
private static bool DoStrictParse(
String s,
String formatParam,
DateTimeStyles styles,
DateTimeFormatInfo dtfi,
bool isThrowExp,
out DateTime returnValue) {
bool bTimeOnly = false;
returnValue = new DateTime();
ParsingInfo parseInfo = new ParsingInfo();
parseInfo.calendar = dtfi.Calendar;
parseInfo.fAllowInnerWhite = ((styles & DateTimeStyles.AllowInnerWhite) != 0);
parseInfo.fAllowTrailingWhite = ((styles & DateTimeStyles.AllowTrailingWhite) != 0);
if (formatParam.Length == 1) {
formatParam = ExpandPredefinedFormat(formatParam, ref dtfi, parseInfo);
}
DateTimeResult result = new DateTimeResult();
// Reset these values to negative one so that we could throw exception
// if we have parsed every item twice.
result.Hour = result.Minute = result.Second = -1;
__DTString format = new __DTString(formatParam);
__DTString str = new __DTString(s);
if (parseInfo.fAllowTrailingWhite) {
// Trim trailing spaces if AllowTrailingWhite.
format.TrimTail();
format.RemoveTrailingInQuoteSpaces();
str.TrimTail();
}
if ((styles & DateTimeStyles.AllowLeadingWhite) != 0) {
format.SkipWhiteSpaces();
format.RemoveLeadingInQuoteSpaces();
str.SkipWhiteSpaces();
}
//
// Scan every character in format and match the pattern in str.
//
while (format.GetNext()) {
// We trim inner spaces here, so that we will not eat trailing spaces when
// AllowTrailingWhite is not used.
if (parseInfo.fAllowInnerWhite) {
str.SkipWhiteSpaces();
}
if (!ParseByFormat(str, format, parseInfo, dtfi, isThrowExp, result) &&
!isThrowExp) {
return (false);
}
}
if (str.Index < str.Value.Length - 1) {
// There are still remaining character in str.
BCLDebug.Trace("NLS", "DateTimeParse.DoStrictParse(): Still characters in str, str.Index = ", str.Index);
return (ParseFormatError(isThrowExp, "Format_BadDateTime"));
}
if (parseInfo.fUseTwoDigitYear) {
// A two digit year value is expected. Check if the parsed year value is valid.
if (result.Year >= 100) {
BCLDebug.Trace("NLS", "DateTimeParse.DoStrictParse(): Invalid value for two-digit year");
return (ParseFormatError(isThrowExp, "Format_BadDateTime"));
}
result.Year = parseInfo.calendar.ToFourDigitYear(result.Year);
}
if (parseInfo.fUseHour12) {
if (parseInfo.timeMark == -1) {
// hh is used, but no AM/PM designator is specified.
// Assume the time is AM.
// Don't throw exceptions in here becasue it is very confusing for people.
// I always got confused myself when I use "hh:mm:ss" to parse a time string,
// and ParseExact() throws on me (because I didn't use the 24-hour clock 'HH').
parseInfo.timeMark = TM_AM;
BCLDebug.Trace("NLS", "DateTimeParse.DoStrictParse(): hh is used, but no AM/PM designator is specified.");
}
if (result.Hour > 12) {
// AM/PM is used, but the value for HH is too big.
BCLDebug.Trace("NLS", "DateTimeParse.DoStrictParse(): AM/PM is used, but the value for HH is too big.");
//.........这里部分代码省略.........
示例11: ParseByFormat
//.........这里部分代码省略.........
// A time separator is expected.
BCLDebug.Trace("NLS", "DateTimeParse.DoStrictParse(): ':' is expected");
return (ParseFormatError(isThrowExp, "Format_BadDateTime"));
}
break;
case '/':
if (!str.Match(dtfi.DateSeparator)) {
// A date separator is expected.
BCLDebug.Trace("NLS", "DateTimeParse.DoStrictParse(): date separator is expected");
return (ParseFormatError(isThrowExp, "Format_BadDateTime"));
}
break;
case '\"':
case '\'':
StringBuilder enquotedString = new StringBuilder();
try {
// Use ParseQuoteString so that we can handle escape characters within the quoted string.
tokenLen = DateTimeFormat.ParseQuoteString(format.Value, format.Index, enquotedString);
} catch (Exception) {
if (isThrowExp) {
throw new FormatException(String.Format(Environment.GetResourceString("Format_BadQuote"), ch));
} else {
return (false);
}
}
format.Index += tokenLen - 1;
// Some cultures uses space in the quoted string. E.g. Spanish has long date format as:
// "dddd, dd' de 'MMMM' de 'yyyy". When inner spaces flag is set, we should skip whitespaces if there is space
// in the quoted string.
String quotedStr = enquotedString.ToString();
for (int i = 0; i < quotedStr.Length; i++) {
if (quotedStr[i] == ' ' && parseInfo.fAllowInnerWhite) {
str.SkipWhiteSpaces();
} else if (!str.Match(quotedStr[i])) {
// Can not find the matching quoted string.
BCLDebug.Trace("NLS", "DateTimeParse.DoStrictParse():Quote string doesn't match");
return (ParseFormatError(isThrowExp, "Format_BadDateTime"));
}
}
break;
case '%':
// Skip this so we can get to the next pattern character.
// Used in case like "%d", "%y"
// Make sure the next character is not a '%' again.
if (format.Index >= format.Value.Length - 1 || format.Value[format.Index + 1] == '%') {
BCLDebug.Trace("NLS", "DateTimeParse.DoStrictParse():%% is not permitted");
return (ParseFormatError(isThrowExp, "Format_BadFormatSpecifier"));
}
break;
case '\\':
// Escape character. For example, "\d".
// Get the next character in format, and see if we can
// find a match in str.
if (format.GetNext()) {
if (!str.Match(format.GetChar())) {
// Can not find a match for the escaped character.
BCLDebug.Trace("NLS", "DateTimeParse.DoStrictParse(): Can not find a match for the escaped character");
return (ParseFormatError(isThrowExp, "Format_BadDateTime"));
}
} else {
BCLDebug.Trace("NLS", "DateTimeParse.DoStrictParse(): \\ is at the end of the format string");
return (ParseFormatError(isThrowExp, "Format_BadFormatSpecifier"));
}
break;
示例12: ParseISO8601
//
// Parse the ISO8601 format string found during Parse();
//
//
private static DateTime ParseISO8601(DateTimeRawInfo raw, __DTString str, DateTimeStyles styles) {
if (raw.year < 0 || raw.num[0] < 0 || raw.num[1] < 0) {
}
str.Index--;
int hour, minute, second;
bool timeZoneUsed = false;
TimeSpan timeZoneOffset = new TimeSpan();
DateTime time = new DateTime(0);
double partSecond = 0;
str.SkipWhiteSpaces();
ParseDigits(str, 2, true, out hour);
str.SkipWhiteSpaces();
if (str.Match(':')) {
str.SkipWhiteSpaces();
ParseDigits(str, 2, true, out minute);
str.SkipWhiteSpaces();
if (str.Match(':')) {
str.SkipWhiteSpaces();
ParseDigits(str, 2, true, out second);
str.SkipWhiteSpaces();
if (str.GetNext()) {
char ch = str.GetChar();
if (ch == '+' || ch == '-') {
timeZoneUsed = true;
timeZoneOffset = ParseTimeZone(str, str.GetChar());
} else if (ch == '.') {
str.Index++; //ParseFraction requires us to advance to the next character.
partSecond = ParseFraction(str);
} else if (ch == 'Z' || ch == 'z') {
timeZoneUsed = true;
} else {
throw new FormatException(Environment.GetResourceString("Format_BadDateTime"));
}
}
time =new DateTime(raw.year, raw.num[0], raw.num[1], hour, minute, second);
time = time.AddTicks((long)Math.Round(partSecond * Calendar.TicksPerSecond));
if (timeZoneUsed) {
time = AdjustTimeZone(time, timeZoneOffset, styles, false);
}
return time;
}
}
throw new FormatException(Environment.GetResourceString("Format_BadDateTime"));
}