46 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			46 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#include "tai.h"
							 | 
						||
| 
								 | 
							
								#include "caldate.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void caldate_frommjd(struct caldate *cd, int64_t day, int *pwday, int *pyday)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  long year;
							 | 
						||
| 
								 | 
							
								  long month;
							 | 
						||
| 
								 | 
							
								  int yday;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  year = (long)(day / LL(146097));
							 | 
						||
| 
								 | 
							
								  day %= LL(146097);
							 | 
						||
| 
								 | 
							
								  day += LL(678881);
							 | 
						||
| 
								 | 
							
								  while (day >= LL(146097)) { day -= LL(146097); ++year; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* year * 146097 + day - 678881 is MJD; 0 <= day < 146097 */
							 | 
						||
| 
								 | 
							
								  /* 2000-03-01, MJD 51604, is year 5, day 0 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (pwday) *pwday = (int)((day + 3) % 7);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  year *= 4;
							 | 
						||
| 
								 | 
							
								  if (day == LL(146096)) { year += 3; day = 36524L; }
							 | 
						||
| 
								 | 
							
								  else { year += (long)(day / LL(36524)); day %= LL(36524); }
							 | 
						||
| 
								 | 
							
								  year *= 25;
							 | 
						||
| 
								 | 
							
								  year += (long)(day / 1461);
							 | 
						||
| 
								 | 
							
								  day %= 1461;
							 | 
						||
| 
								 | 
							
								  year *= 4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  yday = (day < 306);
							 | 
						||
| 
								 | 
							
								  if (day == 1460) { year += 3; day = 365; }
							 | 
						||
| 
								 | 
							
								  else { year += (long)(day / 365); day %= 365; }
							 | 
						||
| 
								 | 
							
								  yday += (long)day;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  day *= 10;
							 | 
						||
| 
								 | 
							
								  month = (long)((day + 5) / 306);
							 | 
						||
| 
								 | 
							
								  day = (day + 5) % 306;
							 | 
						||
| 
								 | 
							
								  day /= 10;
							 | 
						||
| 
								 | 
							
								  if (month >= 10) { yday -= 306; ++year; month -= 10; }
							 | 
						||
| 
								 | 
							
								  else { yday += 59; month += 2; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  cd->year = year;
							 | 
						||
| 
								 | 
							
								  cd->month = month + 1;
							 | 
						||
| 
								 | 
							
								  cd->day = (long)(day + 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (pyday) *pyday = yday;
							 | 
						||
| 
								 | 
							
								}
							 |