Example #1
0
    private void ParseMeridianAndSetHour( ClockToken[] dt, ref System.Int32 parsePos, TclDateTime calendar, int hour )
    // hour value (1-12 or 0-23) to set.
    {
      int pos = parsePos;
      int hourField;

      if ( pos < dt.Length && dt[pos].is_Renamed( ClockToken.MERIDIAN ) )
      {
        // SupportClass.CalendarManager.manager.Set(calendar, SupportClass.CalendarManager.AM_PM, dt[pos].Int);
        parsePos = pos + 1;
        hourField = SupportClass.CalendarManager.HOUR;
      }
      else
      {
        hourField = SupportClass.CalendarManager.HOUR_OF_DAY;
      }

      if ( hourField == SupportClass.CalendarManager.HOUR && hour == 12 )
      {
        hour = 0;
      }
      calendar.hour = hour;
    }
Example #2
0
    private bool ParseIso( ClockToken[] dt, ref System.Int32 parsePos, TclDateTime calendar )
    // calendar object to set
    {
      int pos = parsePos;

      if ( pos + 6 < dt.Length && dt[pos].IsoBase && dt[pos + 1].is_Renamed( ClockToken.ZONE ) && dt[pos + 2].UNumber && dt[pos + 3].is_Renamed( ':' ) && dt[pos + 4].UNumber && dt[pos + 5].is_Renamed( ':' ) && dt[pos + 6].UNumber )
      {
        calendar.day = dt[pos].Int % 100;
        calendar.month = ( dt[pos].Int % 10000 ) / 100;
        calendar.year = dt[pos].Int / 10000;
        calendar.hour = dt[pos + 2].Int;
        calendar.minute = dt[pos + 4].Int;
        calendar.second = dt[pos + 6].Int;
        parsePos = pos + 7;
        return true;
      }
      if ( pos + 2 < dt.Length && dt[pos].IsoBase && dt[pos + 1].is_Renamed( ClockToken.ZONE ) && dt[pos + 1].Zone.GetUtcOffset( calendar.dateTime ).Hours == ( -7 ) * MILLIS_PER_HOUR && dt[pos + 2].IsoBase )
      {
        calendar.day = dt[pos].Int % 100;
        calendar.month = ( dt[pos].Int % 10000 ) / 100;
        calendar.year = dt[pos].Int / 10000;
        calendar.hour = dt[pos + 2].Int / 10000;
        calendar.minute = ( dt[pos + 2].Int % 10000 ) / 100;
        calendar.second = dt[pos + 2].Int % 100;
        parsePos = pos + 3;
        return true;
      }
      if ( pos + 1 < dt.Length && dt[pos].IsoBase && dt[pos + 1].IsoBase )
      {
        calendar.day = dt[pos].Int % 100;
        calendar.month = ( dt[pos].Int % 10000 ) / 100;
        calendar.year = dt[pos].Int / 10000;
        calendar.hour = dt[pos + 1].Int / 10000;
        calendar.minute = ( dt[pos + 1].Int % 10000 ) / 100;
        calendar.second = dt[pos + 1].Int % 100;
        parsePos = pos + 2;
        return true;
      }
      return false;
    }
Example #3
0
    private bool ParseTrek( ClockToken[] dt, ref System.Int32 parsePos, TclDateTime calendar )
    // calendar object to set
    {
      int pos = parsePos;

      if ( pos + 3 < dt.Length && dt[pos].is_Renamed( ClockToken.STARDATE ) && dt[pos + 1].UNumber && dt[pos + 2].is_Renamed( '.' ) && dt[pos + 3].UNumber )
      {
        GregorianCalendar gcal = new GregorianCalendar();
        int trekYear = dt[pos + 1].Int / 1000 + 2323 - 377;
        int trekDay = 1 + ( ( dt[pos + 1].Int % 1000 ) * ( gcal.IsLeapYear( trekYear ) ? 366 : 365 ) ) / 1000;
        int trekSeconds = dt[pos + 3].Int * 144 * 60;
        calendar.year = trekYear;
        calendar.dateTime = gcal.AddDays( calendar.dateTime, trekDay );
        calendar.second = trekSeconds;
        parsePos = pos + 4;
        return true;
      }
      return false;
    }
Example #4
0
    private bool ParseDate( ClockToken[] dt, ref System.Int32 parsePos, TclDateTime calendar )
    // calendar object to set
    {
      int pos = parsePos;

      if ( pos + 4 < dt.Length && dt[pos].UNumber && dt[pos + 1].is_Renamed( '/' ) && dt[pos + 2].UNumber && dt[pos + 3].is_Renamed( '/' ) && dt[pos + 4].UNumber )
      {
        calendar.day = dt[pos + 2].Int;
        calendar.month = dt[pos].Int;
        calendar.year = dt[pos + 4].Int;
        parsePos = pos + 5;
        return true;
      }
      if ( pos + 4 < dt.Length && dt[pos].UNumber && dt[pos + 1].is_Renamed( '-' ) && dt[pos + 2].is_Renamed( ClockToken.MONTH ) && dt[pos + 3].is_Renamed( '-' ) && dt[pos + 4].UNumber )
      {
        calendar.year = dt[pos + 4].Int;
        calendar.month = dt[pos + 2].Int;
        calendar.day = dt[pos].Int;
        parsePos = pos + 5;
        return true;
      }
      if ( pos + 4 < dt.Length && dt[pos].UNumber && dt[pos + 1].is_Renamed( '-' ) && dt[pos + 2].UNumber && dt[pos + 3].is_Renamed( '-' ) && dt[pos + 4].UNumber )
      {
        calendar.year = dt[pos].Int;
        calendar.month = dt[pos + 2].Int;
        calendar.day = dt[pos + 4].Int;
        parsePos = pos + 5;
        return true;
      }
      if ( pos + 3 < dt.Length && dt[pos].is_Renamed( ClockToken.MONTH ) && dt[pos + 1].UNumber && dt[pos + 2].is_Renamed( ',' ) && dt[pos + 3].UNumber )
      {
        calendar.day = dt[pos + 1].Int;
        calendar.month = dt[pos].Int;
        calendar.year = dt[pos + 3].Int;
        parsePos = pos + 4;
        return true;
      }
      if ( pos + 2 < dt.Length && dt[pos].UNumber && dt[pos + 1].is_Renamed( '/' ) && dt[pos + 2].UNumber )
      {
        calendar.day = dt[pos + 2].Int;
        calendar.month = dt[pos].Int;
        parsePos = pos + 3;
        return true;
      }
      if ( pos + 2 < dt.Length && dt[pos].UNumber && dt[pos + 1].is_Renamed( ClockToken.MONTH ) && dt[pos + 2].UNumber )
      {
        calendar.day = dt[pos].Int;
        calendar.month = dt[pos + 1].Int;
        calendar.year = dt[pos + 2].Int;
        parsePos = pos + 3;
        return true;
      }
      if ( pos + 1 < dt.Length && dt[pos].is_Renamed( ClockToken.MONTH ) && dt[pos + 1].UNumber )
      {
        calendar.day = dt[pos + 1].Int;
        calendar.month = dt[pos].Int;
        parsePos = pos + 2;
        return true;
      }
      if ( pos + 1 < dt.Length && dt[pos].UNumber && dt[pos + 1].is_Renamed( ClockToken.MONTH ) )
      {
        calendar.day = dt[pos].Int;
        calendar.month = dt[pos + 1].Int;
        parsePos = pos + 2;
        return true;
      }
      if ( pos < dt.Length && dt[pos].IsoBase )
      {
        calendar.day = dt[pos].Int % 100;
        calendar.month = ( dt[pos].Int % 10000 ) / 100;
        calendar.year = dt[pos].Int / 10000;
        parsePos = pos + 1;
        return true;
      }
      if ( pos < dt.Length && dt[pos].is_Renamed( ClockToken.EPOCH ) )
      {
        calendar.day = 1;
        calendar.month = 0;
        calendar.year = EPOCH_YEAR;
        parsePos = pos + 1;
        return true;
      }
      return false;
    }
Example #5
0
    private bool ParseNumber( ClockToken[] dt, ref System.Int32 parsePos, TclDateTime calendar, bool mayBeYear )
    // number is considered to be year?
    {
      int pos = parsePos;

      if ( pos < dt.Length && dt[pos].UNumber )
      {
        parsePos = pos + 1;
        if ( mayBeYear )
        {
          calendar.year = dt[pos].Int;
        }
        else
        {
          calendar.hour = dt[pos].Int / 100;
          calendar.minute = dt[pos].Int % 100;
          calendar.second = 0;
        }
        return true;
      }
      return false;
    }
Example #6
0
    private bool ParseZone( ClockToken[] dt, ref System.Int32 parsePos, TclDateTime calendar )
    // calendar object to set
    {
      int pos = parsePos;

      if ( pos + 1 < dt.Length && dt[pos].is_Renamed( ClockToken.ZONE ) && dt[pos + 1].is_Renamed( ClockToken.DST ) )
      {

        //				calendar.setTimeZone(dt[pos].Zone);
        parsePos = pos + 2;
        return true;
      }
      if ( pos < dt.Length && dt[pos].is_Renamed( ClockToken.ZONE ) )
      {

        //				calendar.setTimeZone(dt[pos].Zone);
        parsePos = pos + 1;
        return true;
      }
      if ( pos < dt.Length && dt[pos].is_Renamed( ClockToken.DAYZONE ) )
      {

        //				calendar.setTimeZone(dt[pos].Zone);
        parsePos = pos + 1;
        return true;
      }
      return false;
    }
Example #7
0
    private bool ParseTime( ClockToken[] dt, ref System.Int32 parsePos, TclDateTime calendar )
    // calendar object to set
    {
      int pos = parsePos;

      if ( pos + 6 < dt.Length && dt[pos].UNumber && dt[pos + 1].is_Renamed( ':' ) && dt[pos + 2].UNumber && dt[pos + 3].is_Renamed( ':' ) && dt[pos + 4].UNumber && dt[pos + 5].is_Renamed( '-' ) && dt[pos + 6].UNumber )
      {
        ClockToken zone = GetTimeZoneFromRawOffset( ( -dt[pos + 6].Int ) / 100 );
        if ( zone != null )
        {
          calendar.hour = dt[pos].Int;
          calendar.minute = dt[pos + 2].Int;
          calendar.second = dt[pos + 4].Int;
          // TODO
          //					calendar.setTimeZone(zone.Zone);
          parsePos = pos + 7;
          return true;
        }
      }
      if ( pos + 4 < dt.Length && dt[pos].UNumber && dt[pos + 1].is_Renamed( ':' ) && dt[pos + 2].UNumber && dt[pos + 3].is_Renamed( ':' ) && dt[pos + 4].UNumber )
      {
        parsePos = pos + 5;
        ParseMeridianAndSetHour( dt, ref parsePos, calendar, dt[pos].Int );
        calendar.minute = dt[pos + 2].Int;
        calendar.second = dt[pos + 4].Int;
        return true;
      }
      if ( pos + 4 < dt.Length && dt[pos].UNumber && dt[pos + 1].is_Renamed( ':' ) && dt[pos + 2].UNumber && dt[pos + 3].is_Renamed( '-' ) && dt[pos + 4].UNumber )
      {
        ClockToken zone = GetTimeZoneFromRawOffset( ( -dt[pos + 4].Int ) / 100 );
        if ( zone != null )
        {
          calendar.hour = dt[pos].Int;
          calendar.minute = dt[pos + 2].Int;

          //					calendar.setTimeZone(zone.Zone);
          parsePos = pos + 5;
          return true;
        }
      }
      if ( pos + 2 < dt.Length && dt[pos].UNumber && dt[pos + 1].is_Renamed( ':' ) && dt[pos + 2].UNumber )
      {
        parsePos = pos + 3;
        ParseMeridianAndSetHour( dt, ref parsePos, calendar, dt[pos].Int );
        calendar.minute = dt[pos + 2].Int;
        return true;
      }
      if ( pos + 1 < dt.Length && dt[pos].UNumber && dt[pos + 1].is_Renamed( ClockToken.MERIDIAN ) )
      {
        parsePos = pos + 1;
        ParseMeridianAndSetHour( dt, ref parsePos, calendar, dt[pos].Int );
        return true;
      }
      return false;
    }
Example #8
0
    private System.DateTime GetDate( string dateString, System.DateTime baseDate, bool useGMT )
    {
      if ( useGMT )
      {
        baseDate = baseDate.ToUniversalTime();
      }
      TclDateTime calendar = new TclDateTime();
      calendar.dateTime = baseDate;
      calendar.hour = 0;
      calendar.minute = 0;
      calendar.second = 0;
      calendar.millisecond = 0;

      ClockToken[] dt = GetTokens( dateString, false );

      System.Int32 parsePos = 0;
      ClockRelTimespan diff = new ClockRelTimespan();
      int hasTime = 0;
      int hasZone = 0;
      int hasDate = 0;
      int hasDay = 0;
      int hasOrdMonth = 0;
      int hasRel = 0;

      while ( parsePos < dt.Length )
      {
        if ( ParseTime( dt, ref parsePos, calendar ) )
        {
          hasTime++;
        }
        else if ( ParseZone( dt, ref parsePos, calendar ) )
        {
          hasZone++;
        }
        else if ( ParseIso( dt, ref parsePos, calendar ) )
        {
          hasDate++;
        }
        else if ( ParseDate( dt, ref parsePos, calendar ) )
        {
          hasDate++;
        }
        else if ( ParseDay( dt, ref parsePos, diff ) )
        {
          hasDay++;
        }
        else if ( ParseOrdMonth( dt, ref parsePos, diff ) )
        {
          hasOrdMonth++;
        }
        else if ( ParseRelSpec( dt, ref parsePos, diff ) )
        {
          hasRel++;
        }
        else if ( ParseNumber( dt, ref parsePos, calendar, hasDate > 0 && hasTime > 0 && hasRel == 0 ) )
        {
          if ( hasDate == 0 || hasTime == 0 || hasRel > 0 )
          {
            hasTime++;
          }
        }
        else if ( ParseTrek( dt, ref parsePos, calendar ) )
        {
          hasDate++;
          hasTime++;
        }
        else
        {
          goto failed;
        }
      }

      if ( hasTime > 1 || hasZone > 1 || hasDate > 1 || hasDay > 1 || hasOrdMonth > 1 )
      {
        goto failed;
      }

      // The following line handles years that are specified using
      // only two digits.  The line of code below implements a policy
      // defined by the X/Open workgroup on the millinium rollover.
      // Note: some of those dates may not actually be valid on some
      // platforms.  The POSIX standard startes that the dates 70-99
      // shall refer to 1970-1999 and 00-38 shall refer to 2000-2038.
      // This later definition should work on all platforms.

      int thisYear = calendar.year;
      if ( thisYear < 100 )
      {
        if ( thisYear >= 69 )
        {
          calendar.year = thisYear + 1900;
        }
        else
        {
          calendar.year = thisYear + 2000;
        }
      }

      if ( hasRel > 0 )
      {
        if ( hasTime == 0 && hasDate == 0 && hasDay == 0 )
        {
          calendar.dateTime = baseDate;
        }
        // Certain JDK implementations are buggy WRT DST.
        // Work around this issue by adding a day instead
        // of a days worth of seconds.
        int seconds_in_day = ( 60 * 60 * 24 );
        int seconds = diff.Seconds;
        bool negative_seconds = ( seconds < 0 );
        int days = 0;
        if ( negative_seconds )
          seconds *= ( -1 );
        while ( seconds >= seconds_in_day )
        {
          seconds -= seconds_in_day;
          days++;
        }
        if ( negative_seconds )
        {
          seconds *= ( -1 );
          days *= ( -1 );
        }
        if ( days != 0 )
        {

          //					calendar.add(SupportClass.CalendarManager.DATE, days);
        }
        if ( seconds != 0 )
        {

          //					calendar.add(SupportClass.CalendarManager.SECOND, seconds);
        }

        //				calendar.add(SupportClass.CalendarManager.MONTH, diff.Months);
      }

      if ( hasDay > 0 && hasDate == 0 )
      {
        SetWeekday( calendar, diff );
      }

      if ( hasOrdMonth > 0 )
      {
        SetOrdMonth( calendar, diff );
      }
      try
      {
        return calendar.dateTime;
      }
      catch ( Exception )
      {
        throw new FormatException();
      }
failed:
      throw new FormatException();
    }
Example #9
0
    private void SetOrdMonth( TclDateTime calendar, ClockRelTimespan diff )
    // time difference to evaluate
    {
      int month = diff.Months;
      int ordMonth = diff.OrdMonth;

      //			calendar.add(SupportClass.CalendarManager.MONTH, 1); /* we want to get the next month... */
      //			while (SupportClass.CalendarManager.manager.Get(calendar, SupportClass.CalendarManager.MONTH) != month)
      //			{
      //				calendar.add(SupportClass.CalendarManager.MONTH, 1);
      //			}
      //			if (ordMonth > 1)
      //			{
      //				calendar.add(SupportClass.CalendarManager.YEAR, ordMonth - 1);
      //			}
      calendar.day = 1;
      calendar.hour = 0;
      calendar.minute = 0;
      calendar.second = 0;
    }
Example #10
0
    private void SetWeekday( TclDateTime calendar, ClockRelTimespan diff )
    // time difference to evaluate
    {
      int weekday = diff.getWeekday();
      int dayOrdinal = diff.DayOrdinal;

      // ATK
      //			while (SupportClass.CalendarManager.manager.Get(calendar, SupportClass.CalendarManager.DAY_OF_WEEK) != weekday)
      //			{
      //				
      //				calendar.add(SupportClass.CalendarManager.DATE, 1);
      //			}
      //			if (dayOrdinal > 1)
      //			{
      //				
      //				calendar.add(SupportClass.CalendarManager.DATE, 7 * (dayOrdinal - 1));
      //			}
    }