feat(functions): add date and time functions
This commit is contained in:
1 parent
d81bcf406a
commit
d61bc1ba14
1 file changed
+75
@@ -0,0 +1,75 @@
|
|||||||
|
import '../dates.dart';
|
||||||
|
import '../evaluator.dart';
|
||||||
|
import '../values.dart';
|
||||||
|
import 'helpers.dart';
|
||||||
|
|
||||||
|
void registerDate(Map<String, CellFunction> registry) {
|
||||||
|
registry['DATE'] = (args, ctx) {
|
||||||
|
arity(args, 3, 3);
|
||||||
|
return NumberValue(serialFromDate(intArg(args[0], ctx), intArg(args[1], ctx), intArg(args[2], ctx)));
|
||||||
|
};
|
||||||
|
|
||||||
|
registry['TODAY'] = (args, ctx) {
|
||||||
|
arity(args, 0, 0);
|
||||||
|
return NumberValue(todaySerial());
|
||||||
|
};
|
||||||
|
|
||||||
|
registry['NOW'] = (args, ctx) {
|
||||||
|
arity(args, 0, 0);
|
||||||
|
final now = DateTime.now();
|
||||||
|
final dayFraction =
|
||||||
|
(now.hour * 3600 + now.minute * 60 + now.second) / 86400.0;
|
||||||
|
return NumberValue(todaySerial() + dayFraction);
|
||||||
|
};
|
||||||
|
|
||||||
|
registry['YEAR'] = (args, ctx) {
|
||||||
|
arity(args, 1, 1);
|
||||||
|
return NumberValue(dateFromSerial(numberArg(args[0], ctx)).year.toDouble());
|
||||||
|
};
|
||||||
|
|
||||||
|
registry['MONTH'] = (args, ctx) {
|
||||||
|
arity(args, 1, 1);
|
||||||
|
return NumberValue(dateFromSerial(numberArg(args[0], ctx)).month.toDouble());
|
||||||
|
};
|
||||||
|
|
||||||
|
registry['DAY'] = (args, ctx) {
|
||||||
|
arity(args, 1, 1);
|
||||||
|
return NumberValue(dateFromSerial(numberArg(args[0], ctx)).day.toDouble());
|
||||||
|
};
|
||||||
|
|
||||||
|
registry['WEEKDAY'] = (args, ctx) {
|
||||||
|
arity(args, 1, 2);
|
||||||
|
final mode = args.length > 1 ? intArg(args[1], ctx) : 1;
|
||||||
|
return NumberValue(weekday(numberArg(args[0], ctx), mode: mode).toDouble());
|
||||||
|
};
|
||||||
|
|
||||||
|
registry['DATEDIF'] = (args, ctx) {
|
||||||
|
arity(args, 3, 3);
|
||||||
|
final start = numberArg(args[0], ctx);
|
||||||
|
final end = numberArg(args[1], ctx);
|
||||||
|
final unit = textArg(args[2], ctx);
|
||||||
|
if (end < start) throw const EvalException(ErrorValue(ErrorKind.numError));
|
||||||
|
try {
|
||||||
|
return NumberValue(datedif(start, end, unit).toDouble());
|
||||||
|
} on ArgumentError {
|
||||||
|
throw const EvalException(ErrorValue(ErrorKind.value));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
registry['EDATE'] = (args, ctx) {
|
||||||
|
arity(args, 2, 2);
|
||||||
|
return NumberValue(edate(numberArg(args[0], ctx), intArg(args[1], ctx)));
|
||||||
|
};
|
||||||
|
|
||||||
|
registry['EOMONTH'] = (args, ctx) {
|
||||||
|
arity(args, 2, 2);
|
||||||
|
final shifted = edate(numberArg(args[0], ctx), intArg(args[1], ctx));
|
||||||
|
final date = dateFromSerial(shifted);
|
||||||
|
return NumberValue(serialFromDate(date.year, date.month, daysInMonth(date.year, date.month)));
|
||||||
|
};
|
||||||
|
|
||||||
|
registry['DAYS'] = (args, ctx) {
|
||||||
|
arity(args, 2, 2);
|
||||||
|
return NumberValue((numberArg(args[0], ctx) - numberArg(args[1], ctx)).floorToDouble());
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in new issue
Block a user