486 bool ret =
VuoTime_getComponents(value, &year, NULL, &month, &dayOfMonth, NULL, &dayOfWeek, &hour, &minute, &second);
490 if (unit == VuoTimeUnit_Millennium)
492 if (roundingMethod == VuoRoundingMethod_Nearest)
493 return VuoTime_make(1000*(year/1000) + (year%1000 > 500 ? 1000 : 0), 1, 1, 0, 0, 0);
494 else if (roundingMethod == VuoRoundingMethod_Down)
496 else if (roundingMethod == VuoRoundingMethod_Up)
497 return VuoTime_make(1000*(year/1000) + (year%1000 + month + dayOfMonth + hour + minute + second > 0 ? 1000 : 0), 1, 1, 0, 0, 0);
499 else if (unit == VuoTimeUnit_Century)
501 if (roundingMethod == VuoRoundingMethod_Nearest)
502 return VuoTime_make(100*(year/100) + (year%100 > 50 ? 100 : 0), 1, 1, 0, 0, 0);
503 else if (roundingMethod == VuoRoundingMethod_Down)
505 else if (roundingMethod == VuoRoundingMethod_Up)
506 return VuoTime_make(100*(year/100) + (year%100 + month + dayOfMonth + hour + minute + second > 0 ? 100 : 0), 1, 1, 0, 0, 0);
508 else if (unit == VuoTimeUnit_Decade)
510 if (roundingMethod == VuoRoundingMethod_Nearest)
511 return VuoTime_make(10*(year/10) + (year%10 > 5 ? 10 : 0), 1, 1, 0, 0, 0);
512 else if (roundingMethod == VuoRoundingMethod_Down)
514 else if (roundingMethod == VuoRoundingMethod_Up)
515 return VuoTime_make(10*(year/10) + (year%10 + month + dayOfMonth + hour + minute + second > 0 ? 10 : 0), 1, 1, 0, 0, 0);
517 else if (unit == VuoTimeUnit_Year)
519 if (roundingMethod == VuoRoundingMethod_Nearest)
520 return VuoTime_make(year + (month > 6 ? 1 : 0), 1, 1, 0, 0, 0);
521 else if (roundingMethod == VuoRoundingMethod_Down)
523 else if (roundingMethod == VuoRoundingMethod_Up)
524 return VuoTime_make(year + (month + dayOfMonth + hour + minute + second > 0 ? 1 : 0), 1, 1, 0, 0, 0);
526 else if (unit == VuoTimeUnit_Quarter)
528 if (roundingMethod == VuoRoundingMethod_Nearest)
529 return VuoTime_make(year, 3*((month-1)/3) + 1 + ((month-1)%3 > 1 ? 3 : 0), 1, 0, 0, 0);
530 else if (roundingMethod == VuoRoundingMethod_Down)
531 return VuoTime_make(year, 3*((month-1)/3) + 1, 1, 0, 0, 0);
532 else if (roundingMethod == VuoRoundingMethod_Up)
533 return VuoTime_make(year, 3*((month-1)/3) + 1 + ((month-1)%3 + dayOfMonth + hour + minute + second > 0 ? 3 : 0), 1, 0, 0, 0);
535 else if (unit == VuoTimeUnit_Month)
537 if (roundingMethod == VuoRoundingMethod_Nearest)
538 return VuoTime_make(year, month + (dayOfMonth > 15 ? 1 : 0), 1, 0, 0, 0);
539 else if (roundingMethod == VuoRoundingMethod_Down)
541 else if (roundingMethod == VuoRoundingMethod_Up)
542 return VuoTime_make(year, month + (dayOfMonth + hour + minute + second > 0 ? 1 : 0), 1, 0, 0, 0);
544 else if (unit == VuoTimeUnit_WeekSunday)
546 if (roundingMethod == VuoRoundingMethod_Nearest)
547 return VuoTime_make(year, month, dayOfMonth + (dayOfWeek > VuoWeekday_Wednesday ? 7-dayOfWeek : -dayOfWeek), 0, 0, 0);
548 else if (roundingMethod == VuoRoundingMethod_Down)
549 return VuoTime_make(year, month, dayOfMonth - dayOfWeek, 0, 0, 0);
550 else if (roundingMethod == VuoRoundingMethod_Up)
551 return VuoTime_make(year, month, dayOfMonth + (dayOfWeek + hour + minute + second > 0 ? 7-dayOfWeek : 0), 0, 0, 0);
553 else if (unit == VuoTimeUnit_WeekMonday)
555 if (dayOfWeek == VuoWeekday_Sunday)
558 if (roundingMethod == VuoRoundingMethod_Nearest)
559 return VuoTime_make(year, month, dayOfMonth + (dayOfWeek > VuoWeekday_Thursday ? 8-dayOfWeek : 1-dayOfWeek), 0, 0, 0);
560 else if (roundingMethod == VuoRoundingMethod_Down)
561 return VuoTime_make(year, month, dayOfMonth - dayOfWeek + 1, 0, 0, 0);
562 else if (roundingMethod == VuoRoundingMethod_Up)
563 return VuoTime_make(year, month, dayOfMonth + (dayOfWeek-1 + hour + minute + second > 0 ? 8-dayOfWeek : 0), 0, 0, 0);
565 else if (unit == VuoTimeUnit_Day)
567 if (roundingMethod == VuoRoundingMethod_Nearest)
568 return VuoTime_make(year, month, dayOfMonth + (hour > 12 ? 1 : 0), 0, 0, 0);
569 else if (roundingMethod == VuoRoundingMethod_Down)
571 else if (roundingMethod == VuoRoundingMethod_Up)
572 return VuoTime_make(year, month, dayOfMonth + (hour + minute + second > 0 ? 1 : 0), 0, 0, 0);
574 else if (unit == VuoTimeUnit_Hour)
576 if (roundingMethod == VuoRoundingMethod_Nearest)
577 return VuoTime_make(year, month, dayOfMonth, hour + (minute > 30 ? 1 : 0), 0, 0);
578 else if (roundingMethod == VuoRoundingMethod_Down)
579 return VuoTime_make(year, month, dayOfMonth, hour, 0, 0);
580 else if (roundingMethod == VuoRoundingMethod_Up)
581 return VuoTime_make(year, month, dayOfMonth, hour + (minute + second > 0 ? 1 : 0), 0, 0);
583 else if (unit == VuoTimeUnit_HalfHour)
585 if (roundingMethod == VuoRoundingMethod_Nearest)
586 return VuoTime_make(year, month, dayOfMonth, hour, 30*(minute/30) + (minute%30 > 15 ? 30 : 0), 0);
587 else if (roundingMethod == VuoRoundingMethod_Down)
588 return VuoTime_make(year, month, dayOfMonth, hour, 30*(minute/30), 0);
589 else if (roundingMethod == VuoRoundingMethod_Up)
590 return VuoTime_make(year, month, dayOfMonth, hour, 30*(minute/30) + (minute%30 + second > 0 ? 30 : 0), 0);
592 else if (unit == VuoTimeUnit_QuarterHour)
594 if (roundingMethod == VuoRoundingMethod_Nearest)
595 return VuoTime_make(year, month, dayOfMonth, hour, 15*(minute/15) + (minute%15 > 7 ? 15 : 0), 0);
596 else if (roundingMethod == VuoRoundingMethod_Down)
597 return VuoTime_make(year, month, dayOfMonth, hour, 15*(minute/15), 0);
598 else if (roundingMethod == VuoRoundingMethod_Up)
599 return VuoTime_make(year, month, dayOfMonth, hour, 15*(minute/15) + (minute%15 + second > 0 ? 15 : 0), 0);
601 else if (unit == VuoTimeUnit_Minute)
603 if (roundingMethod == VuoRoundingMethod_Nearest)
604 return VuoTime_make(year, month, dayOfMonth, hour, minute + (second > 30 ? 1 : 0), 0);
605 else if (roundingMethod == VuoRoundingMethod_Down)
606 return VuoTime_make(year, month, dayOfMonth, hour, minute, 0);
607 else if (roundingMethod == VuoRoundingMethod_Up)
608 return VuoTime_make(year, month, dayOfMonth, hour, minute + (second > 0 ? 1 : 0), 0);
610 else if (unit == VuoTimeUnit_Second)
612 if (roundingMethod == VuoRoundingMethod_Nearest)
613 return lround(value);
614 else if (roundingMethod == VuoRoundingMethod_Down)
616 else if (roundingMethod == VuoRoundingMethod_Up)