Snippets
Created by
Riccardo Sibani
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
// 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)
You can clone a snippet to your computer for local editing. Learn more.