| 1486 | } |
| 1487 | |
| 1488 | void fxDateSplit(txNumber value, txBoolean utc, txDateTime* dt) |
| 1489 | { |
| 1490 | txInteger date, time, year, leap, month; |
| 1491 | const txInteger* monthsDays; |
| 1492 | date = (txInteger)c_trunc(value / mxDayMilliseconds); |
| 1493 | time = (txInteger)c_fmod(value, mxDayMilliseconds); |
| 1494 | if (time < 0) { |
| 1495 | date--; |
| 1496 | time += (txInteger)mxDayMilliseconds; |
| 1497 | } |
| 1498 | dt->offset = 0; |
| 1499 | dt->day = (date + 4) % 7; |
| 1500 | if (dt->day < 0) |
| 1501 | dt->day += 7; |
| 1502 | dt->milliseconds = time % 1000; |
| 1503 | time /= 1000; |
| 1504 | dt->seconds = time % 60; |
| 1505 | time /= 60; |
| 1506 | dt->minutes = time % 60; |
| 1507 | time /= 60; |
| 1508 | dt->hours = time; |
| 1509 | date += mxYearDays(1970 + mxYearsOffset); |
| 1510 | year = 400 * (date / mx400YearsDays); |
| 1511 | date %= mx400YearsDays; |
| 1512 | date--; |
| 1513 | year += 100 * (date / mx100YearsDays); |
| 1514 | date %= mx100YearsDays; |
| 1515 | date++; |
| 1516 | year += 4 * (date / mx4YearsDays); |
| 1517 | date %= mx4YearsDays; |
| 1518 | date--; |
| 1519 | year += date / mx1YearDays; |
| 1520 | date %= mx1YearDays; |
| 1521 | year -= mxYearsOffset; |
| 1522 | leap = mxIsLeapYear(year); |
| 1523 | date += leap; |
| 1524 | monthsDays = leap ? gxLeapYearMonthsDays : gxCommonYearMonthsDays; |
| 1525 | for (month = 0; month < 11; month++) { |
| 1526 | if (date < monthsDays[month + 1]) |
| 1527 | break; |
| 1528 | } |
| 1529 | date -= monthsDays[month]; |
| 1530 | dt->date = date + 1; |
| 1531 | dt->month = month; |
| 1532 | dt->year = year; |
| 1533 | if (!utc) { |
| 1534 | txNumber former = value; |
| 1535 | txInteger similar; |
| 1536 | c_time_t time; |
| 1537 | c_tm tm; |
| 1538 | similar = fxDateSimilarYear(year); |
| 1539 | if (similar != year) { |
| 1540 | dt->year = similar; |
| 1541 | value = fxDateMerge(dt, 1); |
| 1542 | } |
| 1543 | time = (txInteger)c_floor(value / 1000.0); |
| 1544 | tm = *c_localtime(&time); |
| 1545 | dt->milliseconds = c_floor(c_fmod(value, 1000.0)); |
no test coverage detected