strftime method

String strftime(
  1. String format,
  2. Tm timeptr
)

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();
}