Snippets

chromawallet only-the-braves

Created by Riccardo Sibani

// source http://howardhinnant.github.io/date_algorithms.html


struct module_args {
	env: text;
}

//struct perpetual {
//	timezone: 
//	datejust;
//}

struct datejust {
	date;
	time;
} 

struct date {
	year: integer;
	monthIdx: integer;
	dayIdx: integer;
}

struct time {
	hours: integer;
	minutes: integer;
	seconds: integer;
	milliseconds: integer?;
}

object utils {
	
	// NOTE one era is 400years. Every 400 years the calendar is exactly the same
	BACK_TO_70s: integer = 719468;  // shifts from march, era 5 to 1970-01-01
//	DAY_SINCE_THE_70s = ; // the 70s will never come back :) 
	DAYS_IN_A_ERA: integer = 146097;
	SECONDS_IN_A_DAY: integer = 86400;
	
	TEST_TIME:integer = 0;
}



function newDate(year: integer, monthIdx: integer, dayIdx: integer): date {
	return date(
		year,
		monthIdx,
		dayIdx
	);
}



function op_last_block_time(): timestamp {
	return op_context.transaction.block.block_height;
}


function dateFromTimestamp(timestamp): datejust {
	 
	return datejust(date(year = 2020, monthIdx = 9, dayIdx=  9), time(hours= 13, minutes= 30, seconds = 60, null));
}

function toTimestamp(_year: integer, _month: integer, _day: integer): integer {
	// doy = (153 * m + (m>2? -3 : 9)) +2)/5 + d -1
	// doe = yoe * 365 + yoe /4 - yoe / 100 + doy
	val day = _day;
	val month = _month;
	val year = _year - if( month <= 2)  1 else 0;
	val era: integer = (if(year >=0) year else year - 399) / 400;
	val yoe: integer = year - era * 400;												// [0, 399]
	val doy: integer = (153 * (month + (if(month>2) -3 else 9)) +2) /5 + day-1;  		// [0, 365]
	val doe: integer = yoe * 365 + yoe/4 - yoe/100 + doy; 								// [0, 146096]
	
	print("year", year);
	print("era", era);
	print("yoe", yoe);
	print("doy", doy);
	print("doe", doe);
	return (era * utils.DAYS_IN_A_ERA + doe - utils.BACK_TO_70s) * utils.SECONDS_IN_A_DAY; // 
}


function fromTimestamp(_timestamp: timestamp): date {
	val timestamp = (_timestamp / utils.SECONDS_IN_A_DAY)+ utils.BACK_TO_70s; // set time to march, era 5
	val era: integer = (if(timestamp>=0) timestamp else timestamp - (utils.DAYS_IN_A_ERA-1)) / utils.DAYS_IN_A_ERA;
	print("SHOULD BE ERA", timestamp / utils.DAYS_IN_A_ERA);
	val doe: integer = (timestamp - (era * utils.DAYS_IN_A_ERA));
	val yoe: integer = ((doe - (doe/1460) + (doe / 36524) - (doe/(utils.DAYS_IN_A_ERA-1)))/ 365);
	val year: integer = yoe + era * 400;
	val doy: integer = doe - (365*yoe + yoe/4 - yoe/100);
	val mp: integer = (5*doy + 2) / 153;
	val day: integer = doy - (153*mp+2) /5 +1;
	val month: integer = mp +(if(mp<10) 3 else -9);
	
	print("era", era);
	print("doe", doe);
	print("yoe", yoe);
	print("year", year);
	print("doy", doy);
	
	
	return date(year = year + if(month<=2) 1 else 0, monthIdx = month, dayIdx = day);	    
}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.