Есть ли описатель короткого формата для времени и смещения ISO 8601 без дробных секунд?

Существует ли описатель формата "short [er]" для представления ISO-8601 без [необязательного ] доли секунды?

То есть, учитывая

var n = DateTimeOffset.Now;

// short "s" format  -  2014-02-14T10:41:49
n.ToString("s")
// short "o" format  -  2014-02-14T10:41:49.7200222-08:00
n.ToString("o")

// desired output
// custom format    -  2014-02-14T10:41:49-08:30
n.ToString("yyyy-MM-ddTHH:mm:sszzz")

есть ли описатель формата "short [er]" для последнего случая?


Уточнение контекста: я использую форматы в основном с string.Format, где длинный формат может быстро запутать строку формата.


person user2864740    schedule 14.02.2014    source источник
comment
Похоже, вы уже сделали то, что вам нужно, со строкой формата yyyy-MM-ddTHH:mm:sszzz. Какая у вас проблема?   -  person Wagner DosAnjos    schedule 14.02.2014
comment
@wdosanjos Как я и спрашивал, мне было интересно, есть ли более короткий спецификатор стандартного формата, который я упускаю из виду :) string.Format("..{0:yyyy-MM-ddTHH:mm:sszzz}..{1:yyyy-MM-ddTHH:mm:sszzz}..", ..) становится уродливым, чтобы выглядеть довольно быстро.   -  person user2864740    schedule 14.02.2014
comment
@wdosanjos Конечно, ответ может быть просто "нет" или "нет", но вы можете ..   -  person user2864740    schedule 14.02.2014
comment
Возможно string.Format("{0:s}{0:zzz}", DateTime.Now)   -  person Wagner DosAnjos    schedule 14.02.2014
comment
Будет ли n.ToString("szzz") работать? Это могло бы быть хорошим кратким решением.   -  person Raidri    schedule 14.02.2014
comment
@Raidri szzz приводит к 42-08: 00, в этом случае s кажется юлианским днем ​​(?) Или не коротким форматом, каким бы он ни был. Хотя это было бы здорово.   -  person user2864740    schedule 14.02.2014
comment
@wdosanjos Это действительно работает в контексте string.Format. Все равно короче ..   -  person user2864740    schedule 14.02.2014
comment
-3 - было бы неплохо, если бы кто-нибудь объяснил почему.   -  person user2864740    schedule 18.07.2016


Ответы (1)


Извините, я неправильно понял вопрос в первый раз. ИМХО, лучше всего подойдет метод расширения:

class Program {    
    static void Main() {
        Console.WriteLine(DateTimeOffset.Now.ToCustomString());
    }
}

static class DateHelper {
    public static string ToCustomString(this DateTimeOffset time) {
        return time.ToString("yyyy-MM-ddTHH:mm:sszzz", CultureInfo.InvariantCulture);
    }
}

вам необходимо указать CultureInfo.InvariantCulture, иначе будет использоваться CurrentCulture, который заменит : на текущий разделитель компонентов регионального времени пользователя, который может не быть двоеточием, и в результате получится строка, не соответствующая ISO 8601.

Если вам нужно использовать его в более длинных строках с несколькими полями подстановки, возможно, посмотрите поставщики настраиваемых форматов.

person LeffeBrune    schedule 14.02.2014
comment
Я не понимаю бита усечения. Спецификатор настраиваемого формата работает, но кажется излишне длинным. Трудно преобразовать переменные в строки формата (как в случае с string.Format), хотя я думаю, что всегда мог бы использовать служебный метод или переменную и ToString до использования в таком случае ... - person user2864740; 14.02.2014
comment
Это не должно показаться длинным, просто напишите собственный метод расширения. - person LeffeBrune; 14.02.2014
comment
Я не знаю, почему это не встроенный стандартный формат в .NET - это безумие, потому что это точный формат, который лучше всего работает, например, с элементом HTML5 <time>. Ближайший формат - это двусторонний формат "o", но он включает дробные секунды, которые нам не нужны. Никакой другой встроенный стандартный формат автоматически не включает спецификатор zzz, необходимый при работе с DateTimeOffset. - person Dai; 19.09.2019