internal static string FormatDate(string format, System_DateTime utc, TimeZoneInfo zone)
{
Debug.Assert(zone != null);
if (format == null)
return string.Empty;
var local = TimeZoneInfo.ConvertTime(utc, zone);
// here we are creating output string
StringBuilder result = new StringBuilder();
bool escape = false;
foreach (char ch in format)
{
if (escape)
{
result.Append(ch);
escape = false;
continue;
}
switch (ch)
{
case 'a':
// Lowercase Ante meridiem and Post meridiem - am or pm
result.Append(local.ToString("tt", DateTimeFormatInfo.InvariantInfo).ToLowerInvariant());
break;
case 'A':
// Uppercase Ante meridiem and Post meridiem - AM or PM
result.Append(local.ToString("tt", DateTimeFormatInfo.InvariantInfo));
break;
case 'B':
// Swatch Beat (Internet Time) - 000 through 999
result.AppendFormat("{0:000}", GetSwatchBeat(utc));
break;
case 'c':
{
// ISO 8601 date (added in PHP 5) 2004-02-12T15:19:21+00:00
result.Append(local.ToString("yyyy-MM-dd'T'HH:mm:ss", DateTimeFormatInfo.InvariantInfo));
TimeSpan offset = zone.GetUtcOffset(local);
result.AppendFormat("{0}{1:00}:{2:00}", (offset.Ticks < 0) ? ""/*offset.Hours already < 0*/ : "+", offset.Hours, offset.Minutes);
break;
}
case 'd':
// Day of the month, 2 digits with leading zeros - 01 to 31
result.Append(local.ToString("dd", DateTimeFormatInfo.InvariantInfo));
break;
case 'e':
// Timezone identifier (added in PHP 5.1.0)
//result.Append(zone.Id);
//break;
throw new NotImplementedException();
case 'D':
// A textual representation of a day, three letters - Mon through Sun
result.Append(local.ToString("ddd", DateTimeFormatInfo.InvariantInfo));
break;
case 'F':
// A full textual representation of a month, such as January or March - January through December
result.Append(local.ToString("MMMM", DateTimeFormatInfo.InvariantInfo));
break;
case 'g':
// 12-hour format of an hour without leading zeros - 1 through 12
result.Append(local.ToString("%h", DateTimeFormatInfo.InvariantInfo));
break;
case 'G':
// 24-hour format of an hour without leading zeros - 0 through 23
result.Append(local.ToString("%H", DateTimeFormatInfo.InvariantInfo));
break;
case 'h':
// 12-hour format of an hour with leading zeros - 01 through 12
result.Append(local.ToString("hh", DateTimeFormatInfo.InvariantInfo));
break;
case 'H':
// 24-hour format of an hour with leading zeros - 00 through 23
result.Append(local.ToString("HH", DateTimeFormatInfo.InvariantInfo));
break;
case 'i':
// Minutes with leading zeros - 00 to 59
result.Append(local.ToString("mm", DateTimeFormatInfo.InvariantInfo));
break;
case 'I':
// Whether or not the date is in daylights savings time - 1 if Daylight Savings Time, 0 otherwise.
result.Append(zone.IsDaylightSavingTime(local) ? "1" : "0");
break;
case 'j':
// Day of the month without leading zeros - 1 to 31
result.Append(local.ToString("%d", DateTimeFormatInfo.InvariantInfo));
break;
case 'l':
// A full textual representation of the day of the week - Sunday through Saturday
result.Append(local.ToString("dddd", DateTimeFormatInfo.InvariantInfo));
break;
case 'L':
// Whether it's a leap year - 1 if it is a leap year, 0 otherwise.
result.Append(System_DateTime.IsLeapYear(local.Year) ? "1" : "0");
break;
case 'm':
// Numeric representation of a month, with leading zeros - 01 through 12
result.Append(local.ToString("MM", DateTimeFormatInfo.InvariantInfo));
break;
case 'M':
// A short textual representation of a month, three letters - Jan through Dec
result.Append(local.ToString("MMM", DateTimeFormatInfo.InvariantInfo));
break;
case 'n':
// Numeric representation of a month, without leading zeros - 1 through 12
result.Append(local.ToString("%M", DateTimeFormatInfo.InvariantInfo));
break;
case 'N':
// ISO-8601 numeric representation of the day of the week (added in PHP 5.1.0)
int day_of_week = (int)local.DayOfWeek;
result.Append(day_of_week == 0 ? 7 : day_of_week);
break;
case 'o':
{
// ISO-8601 year number. This has the same value as Y, except that if the ISO
// week number (W) belongs to the previous or next year, that year is used instead.
// (added in PHP 5.1.0)
int week, year;
GetIsoWeekAndYear(local, out week, out year);
result.Append(year);
break;
}
case 'O':
{
// Difference to Greenwich time (GMT) in hours Example: +0200
TimeSpan offset = zone.GetUtcOffset(local);
string sign = (offset.Ticks < 0) ? ((offset.Hours < 0) ? string.Empty : "-") : "+";
result.AppendFormat("{0}{1:00}{2:00}", sign, offset.Hours, offset.Minutes);
break;
}
case 'P':
{
// same as 'O' but with the extra colon between hours and minutes
// Difference to Greenwich time (GMT) in hours Example: +02:00
TimeSpan offset = zone.GetUtcOffset(local);
string sign = (offset.Ticks < 0) ? ((offset.Hours < 0) ? string.Empty : "-") : "+";
result.AppendFormat("{0}{1:00}:{2:00}", sign, offset.Hours, offset.Minutes);
break;
}
case 'r':
// RFC 822 formatted date Example: Thu, 21 Dec 2000 16:01:07 +0200
result.Append(local.ToString("ddd, dd MMM yyyy H:mm:ss ", DateTimeFormatInfo.InvariantInfo));
goto case 'O';
case 's':
// Seconds, with leading zeros - 00 through 59
result.Append(local.ToString("ss", DateTimeFormatInfo.InvariantInfo));
break;
case 'S':
result.Append(GetDayNumberSuffix(local.Day));
break;
case 't':
// Number of days in the given month 28 through 31
result.Append(System_DateTime.DaysInMonth(local.Year, local.Month));
break;
case 'T':
// Timezone setting of this machine Examples: EST, MDT ...
result.Append(zone.IsDaylightSavingTime(local) ? zone.DaylightName : zone.StandardName);
break;
case 'U':
// Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
result.Append(DateTimeUtils.UtcToUnixTimeStamp(utc));
break;
case 'u':
// Microseconds (added in PHP 5.2.2)
result.Append((utc.Millisecond / 1000).ToString("D6"));
break;
case 'w':
// Numeric representation of the day of the week - 0 (for Sunday) through 6 (for Saturday)
result.Append((int)local.DayOfWeek);
break;
case 'W':
{
// ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0) Example: 42 (the 42nd week in the year)
int week, year;
GetIsoWeekAndYear(local, out week, out year);
result.Append(week);
break;
}
case 'y':
// A two digit representation of a year Examples: 99 or 03
result.Append(local.ToString("yy", DateTimeFormatInfo.InvariantInfo));
break;
case 'Y':
// A full numeric representation of a year, 4 digits Examples: 1999 or 2003
result.Append(local.ToString("yyyy", DateTimeFormatInfo.InvariantInfo));
break;
case 'z':
// The day of the year starting from 0
result.Append(local.DayOfYear - 1);
break;
case 'Z':
// TimeZone offset in seconds:
result.Append((int)zone.GetUtcOffset(local).TotalSeconds);
break;
case '\\':
// Escape char. Output next character directly to the result.
escape = true;
break;
default:
// unrecognized character, print it as-is.
result.Append(ch);
break;
}
}
if (escape)
result.Append('\\');
return result.ToString();
}