strftime method
Formats time according to the format string and timeptr structure.
Returns the formatted String.
Supported specifiers: %a, %A, %b, %B, %c, %d, %H, %I, %j,
%m, %M, %p, %S, %U, %w, %W, %x, %X, %y, %Y, %%.
Implementation
String strftime(String format, Tm timeptr) {
const shortDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
const longDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
const shortMonths = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
const longMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
final buffer = StringBuffer();
int i = 0;
while (i < format.length) {
if (format[i] == '%' && i + 1 < format.length) {
final specifier = format[i + 1];
switch (specifier) {
case 'a':
buffer.write((timeptr.tm_wday >= 0 && timeptr.tm_wday <= 6) ? shortDays[timeptr.tm_wday] : '');
break;
case 'A':
buffer.write((timeptr.tm_wday >= 0 && timeptr.tm_wday <= 6) ? longDays[timeptr.tm_wday] : '');
break;
case 'b':
case 'h':
buffer.write((timeptr.tm_mon >= 0 && timeptr.tm_mon <= 11) ? shortMonths[timeptr.tm_mon] : '');
break;
case 'B':
buffer.write((timeptr.tm_mon >= 0 && timeptr.tm_mon <= 11) ? longMonths[timeptr.tm_mon] : '');
break;
case 'c':
buffer.write(asctime(timeptr).replaceAll('\n', ''));
break;
case 'd':
buffer.write(timeptr.tm_mday.toString().padLeft(2, '0'));
break;
case 'H':
buffer.write(timeptr.tm_hour.toString().padLeft(2, '0'));
break;
case 'I':
int hour12 = timeptr.tm_hour % 12;
if (hour12 == 0) hour12 = 12;
buffer.write(hour12.toString().padLeft(2, '0'));
break;
case 'j':
buffer.write((timeptr.tm_yday + 1).toString().padLeft(3, '0'));
break;
case 'm':
buffer.write((timeptr.tm_mon + 1).toString().padLeft(2, '0'));
break;
case 'M':
buffer.write(timeptr.tm_min.toString().padLeft(2, '0'));
break;
case 'p':
buffer.write(timeptr.tm_hour < 12 ? 'AM' : 'PM');
break;
case 'S':
buffer.write(timeptr.tm_sec.toString().padLeft(2, '0'));
break;
case 'U':
case 'W':
buffer.write((timeptr.tm_yday ~/ 7).toString().padLeft(2, '0'));
break;
case 'w':
buffer.write(timeptr.tm_wday.toString());
break;
case 'x':
buffer.write('${(timeptr.tm_mon + 1).toString().padLeft(2, '0')}/${timeptr.tm_mday.toString().padLeft(2, '0')}/${(timeptr.tm_year % 100).toString().padLeft(2, '0')}');
break;
case 'X':
buffer.write('${timeptr.tm_hour.toString().padLeft(2, '0')}:${timeptr.tm_min.toString().padLeft(2, '0')}:${timeptr.tm_sec.toString().padLeft(2, '0')}');
break;
case 'y':
buffer.write((timeptr.tm_year % 100).toString().padLeft(2, '0'));
break;
case 'Y':
buffer.write((timeptr.tm_year + 1900).toString().padLeft(4, '0'));
break;
case '%':
buffer.write('%');
break;
default:
buffer.write('%$specifier');
break;
}
i += 2;
} else {
buffer.write(format[i]);
i++;
}
}
return buffer.toString();
}