Ответ 1
string foo = yourDateTime.ToUniversalTime()
.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
У меня есть DateTime, который я хочу отформатировать до "2009-09-01T00: 00: 00.000Z", но следующий код дает мне "2009-09-01T00: 00: 00.000 + 01: 00" (обе строки ):
new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz")
new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz")
Любые идеи, как заставить его работать?
string foo = yourDateTime.ToUniversalTime()
.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
Почему бы просто не использовать Спецификатор формата "туда и обратно" ( "o" , "o" )?
Спецификатор стандартного формата "O" или "o" представляет собой пользовательскую строку формата даты и времени с использованием шаблона, который сохраняет информацию о часовом поясе и испускает строку результатов, соответствующую стандарту ISO 8601. Для значений DateTime этот спецификатор формата для сохранения значений даты и времени вместе с свойством DateTime.Kind в тексте. Отформатированную строку можно проанализировать с помощью метода DateTime.Parse(String, IFormatProvider, DateTimeStyles) или DateTime.ParseExact, если для параметра styles установлено значение DateTimeStyles.RoundtripKind.
Спецификатор стандартного формата "O" или "o" соответствует строке пользовательского формата "yyyy" - "MM" - "dd'T'HH": 'mm': 'ss..fffffffK для значений DateTime и в строку пользовательского формата "yyyy" - "MM" - "dd'T'HH": 'mm': 'ss.. fffffffzzz "для значений DateTimeOffset. В этой строке пары одиночных кавычек, которые ограничивают отдельные символы, такие как дефисы, двоеточия и буква" Т ", указывают на то, что отдельный символ является литералом, который нельзя изменить. Апострофы не отображаются в выходной строке.
Спецификатор стандартного формата O" или "o" (и строка пользовательского формата" yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffffffK) использует преимущества три способа, которыми ISO 8601 представляет информацию о часовом поясе, чтобы сохранить свойство Kind для значений DateTime:
public class Example
{
public static void Main()
{
DateTime dat = new DateTime(2009, 6, 15, 13, 45, 30,
DateTimeKind.Unspecified);
Console.WriteLine("{0} ({1}) --> {0:O}", dat, dat.Kind);
DateTime uDat = new DateTime(2009, 6, 15, 13, 45, 30,
DateTimeKind.Utc);
Console.WriteLine("{0} ({1}) --> {0:O}", uDat, uDat.Kind);
DateTime lDat = new DateTime(2009, 6, 15, 13, 45, 30,
DateTimeKind.Local);
Console.WriteLine("{0} ({1}) --> {0:O}\n", lDat, lDat.Kind);
DateTimeOffset dto = new DateTimeOffset(lDat);
Console.WriteLine("{0} --> {0:O}", dto);
}
}
// The example displays the following output:
// 6/15/2009 1:45:30 PM (Unspecified) --> 2009-06-15T13:45:30.0000000
// 6/15/2009 1:45:30 PM (Utc) --> 2009-06-15T13:45:30.0000000Z
// 6/15/2009 1:45:30 PM (Local) --> 2009-06-15T13:45:30.0000000-07:00
//
// 6/15/2009 1:45:30 PM -07:00 --> 2009-06-15T13:45:30.0000000-07:00
Лучший формат для использования - "yyyy" - "MM" - "dd'T'HH": 'mm': 'ss'. 'fffK ".
Последняя строка K будет изменена на "Z", если дата UTC или часовой пояс (+ -hh: mm), если она является локальной. (http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx)
Как сказал LukeH, полезно использовать ToUniversalTime, если вы хотите, чтобы все даты были UTC.
Конечный код:
string foo = yourDateTime.ToUniversalTime()
.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK");
Вы хотите использовать DateTimeOffset класс.
var date = new DateTimeOffset(2009, 9, 1, 0, 0, 0, 0, new TimeSpan(0L));
var stringDate = date.ToString("u");
Извините, я пропустил ваше исходное форматирование с помощью miliseconds
var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
Некоторые люди указали, что "ToUniversalTime несколько небезопасно в том, что он может вызвать непреднамеренные неправильные временные рассылки. Расширяя это, я предоставляю более подробный пример решения. Образец здесь создает расширение для объекта DateTime, которое безопасно возвращает UTC DateTime, где вы можете использовать ToString по желанию...
class Program
{
static void Main(string[] args)
{
DateTime dUtc = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Utc);
DateTime dUnspecified = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Unspecified);
//Sample of an unintended mangle:
//Prints "2016-06-01 10:17:00Z"
Console.WriteLine(dUnspecified.ToUniversalTime().ToString("u"));
//Prints "2016 - 06 - 01 03:17:00Z"
Console.WriteLine(dUtc.SafeUniversal().ToString("u"));
//Prints "2016 - 06 - 01 03:17:00Z"
Console.WriteLine(dUnspecified.SafeUniversal().ToString("u"));
}
}
public static class ConvertExtensions
{
public static DateTime SafeUniversal(this DateTime inTime)
{
return (DateTimeKind.Unspecified == inTime.Kind)
? new DateTime(inTime.Ticks, DateTimeKind.Utc)
: inTime.ToUniversalTime();
}
}
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)
возвращает 2017-02-10T08: 12: 39.483Z
Этот код работает для меня:
var datetime = new DateTime(2017, 10, 27, 14, 45, 53, 175, DateTimeKind.Local);
var text = datetime.ToString("o");
Console.WriteLine(text);
-- 2017-10-27T14:45:53.1750000+03:00
// datetime from string
var newDate = DateTime.ParseExact(text, "o", null);
Попробуйте следующее:
DateTime date = DateTime.ParseExact(
"Tue, 1 Jan 2008 00:00:00 UTC",
"ddd, d MMM yyyy HH:mm:ss UTC",
CultureInfo.InvariantCulture);