Пример #1
0
/******************************************************************************
 *       RtlTimeFieldsToTime [NTDLL.@]
 *
 * Convert a TIME_FIELDS structure into a time.
 *
 * PARAMS
 *   ftTimeFields [I] TIME_FIELDS structure to convert.
 *   Time         [O] Destination for the converted time.
 *
 * RETURNS
 *   Success: TRUE.
 *   Failure: FALSE.
 */
BOOLEAN WINAPI RtlTimeFieldsToTime(
  PTIME_FIELDS tfTimeFields,
  LARGE_INTEGER *Time) {
  int CurYear, CurMonth, DeltaYear;
  LONGLONG rcTime;
  TIME_FIELDS TimeFields = *tfTimeFields;

  TRACEN((printf("RtlTimeFieldsToTime\n")))

  rcTime = 0;

  /* FIXME: normalize the TIME_FIELDS structure here */
  while (TimeFields.Second >= SECSPERMIN) {
    NormalizeTimeFields(&TimeFields.Second, &TimeFields.Minute, SECSPERMIN);
  }
  while (TimeFields.Minute >= MINSPERHOUR) {
    NormalizeTimeFields(&TimeFields.Minute, &TimeFields.Hour, MINSPERHOUR);
  }
  while (TimeFields.Hour >= HOURSPERDAY) {
    NormalizeTimeFields(&TimeFields.Hour, &TimeFields.Day, HOURSPERDAY);
  }
  while (TimeFields.Day > MonthLengths[IsLeapYear(TimeFields.Year)][TimeFields.Month - 1]) {
    NormalizeTimeFields(&TimeFields.Day, &TimeFields.Month, SECSPERMIN);
  }
  while (TimeFields.Month > MONSPERYEAR) {
    NormalizeTimeFields(&TimeFields.Month, &TimeFields.Year, MONSPERYEAR);
  }

  /* FIXME: handle calendar corrections here */
  CurYear = TimeFields.Year - EPOCHYEAR;
  DeltaYear = CurYear / 400;
  CurYear -= DeltaYear * 400;
  rcTime += DeltaYear * DAYSPERQUADRICENTENNIUM;
  DeltaYear = CurYear / 100;
  CurYear -= DeltaYear * 100;
  rcTime += DeltaYear * DAYSPERNORMALCENTURY;
  DeltaYear = CurYear / 4;
  CurYear -= DeltaYear * 4;
  rcTime += DeltaYear * DAYSPERNORMALQUADRENNIUM;
  rcTime += CurYear * DAYSPERNORMALYEAR;

  for (CurMonth = 1; CurMonth < TimeFields.Month; CurMonth++) {
    rcTime += MonthLengths[IsLeapYear(CurYear)][CurMonth - 1];
  }
  rcTime += TimeFields.Day - 1;
  rcTime *= SECSPERDAY;
  rcTime += TimeFields.Hour * SECSPERHOUR + TimeFields.Minute * SECSPERMIN + TimeFields.Second;
  rcTime *= TICKSPERSEC;
  rcTime += TimeFields.Milliseconds * TICKSPERMSEC;
  Time->QuadPart = rcTime;

  return TRUE;
}
Пример #2
0
/******************************************************************************
 *  RtlTimeFieldsToTime		[NTDLL.@]
 *
 */
BOOLEAN WINAPI RtlTimeFieldsToTime(
	PTIME_FIELDS tfTimeFields,
	PLARGE_INTEGER Time)
{
	int CurYear, CurMonth;
	long long int rcTime;
	TIME_FIELDS TimeFields = *tfTimeFields;

	rcTime = 0;

	/* FIXME: normalize the TIME_FIELDS structure here */
	while (TimeFields.Second >= SECSPERMIN)
	{ NormalizeTimeFields(&TimeFields.Second, &TimeFields.Minute, SECSPERMIN);
	}
	while (TimeFields.Minute >= MINSPERHOUR)
	{ NormalizeTimeFields(&TimeFields.Minute, &TimeFields.Hour, MINSPERHOUR);
	}
	while (TimeFields.Hour >= HOURSPERDAY)
	{ NormalizeTimeFields(&TimeFields.Hour, &TimeFields.Day, HOURSPERDAY);
	}
	while (TimeFields.Day > MonthLengths[IsLeapYear(TimeFields.Year)][TimeFields.Month - 1])
	{ NormalizeTimeFields(&TimeFields.Day, &TimeFields.Month, SECSPERMIN);
	}
	while (TimeFields.Month > MONSPERYEAR)
	{ NormalizeTimeFields(&TimeFields.Month, &TimeFields.Year, MONSPERYEAR);
	}

	/* FIXME: handle calendar corrections here */
	for (CurYear = EPOCHYEAR; CurYear < TimeFields.Year; CurYear++)
	{ rcTime += YearLengths[IsLeapYear(CurYear)];
	}
	for (CurMonth = 1; CurMonth < TimeFields.Month; CurMonth++)
	{ rcTime += MonthLengths[IsLeapYear(CurYear)][CurMonth - 1];
	}
	rcTime += TimeFields.Day - 1;
	rcTime *= SECSPERDAY;
	rcTime += TimeFields.Hour * SECSPERHOUR + TimeFields.Minute * SECSPERMIN + TimeFields.Second;
	rcTime *= TICKSPERSEC;
	rcTime += TimeFields.Milliseconds * TICKSPERMSEC;
	*Time = *(LARGE_INTEGER *)&rcTime;

	return TRUE;
}