encodeDate method Null safety

String encodeDate(
  1. DateTime dateTime
)

Encodes the given dateTime to a valid MIME date representation

Implementation

static String encodeDate(DateTime dateTime) {
  /*
Date and time values occur in several header fields.  This section
 specifies the syntax for a full date and time specification.  Though
 folding white space is permitted throughout the date-time
 specification, it is RECOMMENDED that a single space be used in each
 place that FWS appears (whether it is required or optional); some
 older implementations will not interpret longer sequences of folding
 white space correctly.
 date-time       =   [ day-of-week "," ] date time [CFWS]

 day-of-week     =   ([FWS] day-name) / obs-day-of-week

 day-name        =   "Mon" / "Tue" / "Wed" / "Thu" /
                     "Fri" / "Sat" / "Sun"

 date            =   day month year

 day             =   ([FWS] 1*2DIGIT FWS) / obs-day

 month           =   "Jan" / "Feb" / "Mar" / "Apr" /
                     "May" / "Jun" / "Jul" / "Aug" /
                     "Sep" / "Oct" / "Nov" / "Dec"

 year            =   (FWS 4*DIGIT FWS) / obs-year

 time            =   time-of-day zone

 time-of-day     =   hour ":" minute [ ":" second ]

 hour            =   2DIGIT / obs-hour

 minute          =   2DIGIT / obs-minute

 second          =   2DIGIT / obs-second

 zone            =   (FWS ( "+" / "-" ) 4DIGIT) / obs-zone

 The day is the numeric day of the month.  The year is any numeric
 year 1900 or later.

 The time-of-day specifies the number of hours, minutes, and
 optionally seconds since midnight of the date indicated.

 The date and time-of-day SHOULD express local time.

 The zone specifies the offset from Coordinated Universal Time (UTC,
 formerly referred to as "Greenwich Mean Time") that the date and
 time-of-day represent.  The "+" or "-" indicates whether the time-of-
 day is ahead of (i.e., east of) or behind (i.e., west of) Universal
 Time.  The first two digits indicate the number of hours difference
 from Universal Time, and the last two digits indicate the number of
 additional minutes difference from Universal Time.  (Hence, +hhmm
 means +(hh * 60 + mm) minutes, and -hhmm means -(hh * 60 + mm)
 minutes).  The form "+0000" SHOULD be used to indicate a time zone at
 Universal Time.  Though "-0000" also indicates Universal Time, it is
 used to indicate that the time was generated on a system that may be
 in a local time zone other than Universal Time and that the date-time
 contains no information about the local time zone.

 A date-time specification MUST be semantically valid.  That is, the
 day-of-week (if included) MUST be the day implied by the date, the
 numeric day-of-month MUST be between 1 and the number of days allowed
 for the specified month (in the specified year), the time-of-day MUST
 be in the range 00:00:00 through 23:59:60 (the number of seconds
 allowing for a leap second; see [RFC1305]), and the last two digits
 of the zone MUST be within the range 00 through 59.
 */
  final buffer = StringBuffer();
  buffer.write(_weekdays[dateTime.weekday - 1]);
  buffer.write(', ');
  buffer.write(dateTime.day.toString().padLeft(2, '0'));
  buffer.write(' ');
  buffer.write(_months[dateTime.month - 1]);
  buffer.write(' ');
  buffer.write(dateTime.year);
  buffer.write(' ');
  buffer.write(dateTime.hour.toString().padLeft(2, '0'));
  buffer.write(':');
  buffer.write(dateTime.minute.toString().padLeft(2, '0'));
  buffer.write(':');
  buffer.write(dateTime.second.toString().padLeft(2, '0'));
  buffer.write(' ');
  if (dateTime.timeZoneOffset.inMinutes > 0) {
    buffer.write('+');
  } else {
    buffer.write('-');
  }
  var hours = dateTime.timeZoneOffset.inHours;
  if (hours < 10 && hours > -10) {
    buffer.write('0');
  }
  buffer.write(hours);
  var minutes = dateTime.timeZoneOffset.inMinutes -
      (dateTime.timeZoneOffset.inHours * 60);
  if (minutes == 0) {
    buffer.write('00');
  } else {
    if (minutes < 10 && minutes > -10) {
      buffer.write('0');
    }
    buffer.write(minutes);
  }
  return buffer.toString();
}