Не думал что задам такой вопрос, но я действительно не могу найти решение отформатировать текущую дату в ISO 8601, отставив тип данных DateTime
Вот мой код:
var datenow = DateTime.Now.ToString("o");
var dateTime2 = DateTime.Parse(datenow);
1 - Разве нельзя сразу вывести DateTime в нужном формате, не переводя его в строку??
2 - Даже если этот вариант самый лучший (туда сюда :) ) DateTime.Parse снова возвращает прежний формат.
Вы путаете DateTime и его строковое представление. Возьмите, например, число 11 — оно может быть записано как 0xB, 013 или там XI, но оно тем не менее всегда остаётся числом.
Сам по себе объект типа DateTime форматом вывода не обладает, это просто объект с полями и методами. То, что вы видите — строковое представление, и да, при выводе объект превращается в строку, либо явно (тогда вы контролируете формат), либо неявно (тогда формат от вас не зависит).
Поэтому то, что вы видите как «значение DateTime» — это есть лишь его строковое представление, одно из возможных. DateTime.Parse лишь превращает форматированную строку назад в DateTime.
Ответ на ваш вопрос отрицательный: DateTime не обладает форматом, и вывести его и правда можно только превратив в строку (либо с указанием формата, либо без).
Как и любой другой тип, кстати.
Правильный вариант для преобразования между строкой и DateTime в обе стороны такой:
var lang = CultureInfo.InvariantCulture; // или CultureInfo.CurrentCulture,
// смотря по тому, что вам нужно
var format = "o";
var dt = DateTime.Now;
var s = dt.ToString(format, lang);
var dt2 = DateTime.ParseExact(s, format, lang);
Допустим, у вас есть строка "FF", содержащая 16-ричное представление числа.
И вы пытаетесь её превратить в значение целочисленного типа. Открываете отладчик и с ужасом видите, что потерялась 16-ричность! Вместо исходного FF вы видите десятичное 255.
Паника. Недоумение.
А что если я скажу вам, что внутри там вовсе не 255? Там число в том виде, с которым вашему компьютеру удобнее производить вычисления, и скорее всего оно в бинарном виде: 0...0 1111 1111.
Вот только вывести вам эти байты напрямую – плохая идея. Во-первых, это особенность того компьютера, которым вы в данный момент пользуетесь. Во-вторых, куда и как выводить? В текстовое поле? Там нужна строка, состоящая из символов. Но у вас их пока нет, только голые байты. Выводить их напрямую опасно – в используемой кодировке печатаемых символов с такими кодами может не быть вовсе.
Поэтому при выводе в любые текстовые места отладчики и многие другие средства выводят значения в тех представлениях, в которых эти значения понятнее всего вам. Для чисел это последовательности арабских десятичных цифр. Так исторически сложилось, этот формат понятен практически всему миру.
Поэтому если вам нужно вывести число в шестнадцатеричном виде, придется преобразовать его в строку самостоятельно с указанием основания системы счисления.
То же самое с DateTime. Да, он теряет формат! И внутри хранит дату в таком безумном виде, что на первый человеческий взгляд даже не будет очевидно, что это момент времени. И преобразовывать её в строку для вывода без иных явных указаний он будет в тот вид, который согласно подсказке системы (локаль) будет вам наиболее понятен.
Если же вам нужно вывести дату в ISO8601, то (как и выше) придётся явно преобразовать его в строку с указанием формата.
Такие дела.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости