Какой ваш любимый формат даты и времени в имени файла? [закрыто]

88

Это несколько субъективный вопрос, не очень важный по большому счету, но то, что меня постоянно раздражает. Кажется, нет очевидного способа поставить отметку времени в имени файла .

Объективная проблема заключается в том, что отметки времени в именах файлов должны быть отсортированными . Но форматы сортируемых дат .NET, такие как «s» ( "yyyy-MM-ddTHH:mm:ss") и «u» ( "yyyy-MM-dd HH:mm:ssZ"), недопустимы в именах файлов из-за символов «:».

Другое дело, что вы должны легко увидеть, используется ли универсальное или местное время . На практике кажется, что пользователи предпочитают местное время всемирному времени.

Я в основном использовал ISO 8601 с базовым форматом времени:

  • Строка формата местного времени "yyyy-MM-ddTHHmmsszz"
  • Строка формата UTC "yyyy-MM-ddTHHmmssZ"

В этих форматах мое текущее местное время будет "2009-08-08T151800+03"и UTC."2009-08-08T121800Z"

Вы также можете автоматически определять DateTime.Kind с помощью «K» и использовать "yyyy-MM-ddTHHmmssK", но тогда вам придется заменить символы «:».

Есть другие предложения?

Изменить: несколько примечаний:

местное время + формат часового пояса "yyyy-MM-ddTHHmmsszz"больше нельзя сортировать, если задействовано несколько часовых поясов. В большинстве случаев имеет смысл опустить информацию о часовом поясе, если она избыточна, и использовать UTC в противном случае.

Другое дело, что UTC всегда следует отмечать буквами «Z», «GMT» или «UTC», чтобы избежать догадок и ошибок.

Юлианские даты и другие звездные даты - это круто, потому что арифметика дат с грегорианским календарем бессмысленна.

Мика
источник
2
Я согласен со всем этим, за исключением того, что считаю это важным в общем плане. Ваш формат является лучшим - я бы даже использовал 4-значный часовой пояс, как указано в ISO8601, для размещения нецелочисленных зон. Меня всегда беспокоило, что ISO8601 не обращается к запрещенному двоеточию в именах файлов.
hpekristiansen
Я предлагаю формат, основанный на ISO 8601, в сообщении на blog.xam.de/2016/07/… - если бы мы могли договориться о формате, наш мир стал бы проще :-)
Д-р Макс Фёлькель
"закрыто как неконструктивное" ?? Есть причины и против каждого предложения, так что это является конструктивным. Не нужно уклоняться от вопроса о более тонких философских деталях именования файлов: D
tanius 08

Ответы:

57

Я использую это:

My-File--2009-12-31--23-59-59.txt
  • Без пробелов
  • Двойные черточки для разделения частей, что позволяет легко увидеть каждую часть
  • Только один знак препинания (тире), что упрощает ввод текста
  • Нет часового пояса, потому что я всегда работаю в моем местном часовом поясе; если бы мне было нужно, я бы пошел с UTC и добавил " --UTC" после времени.
РичиХиндл
источник
5
Я делаю примерно то же самое, хотя начинаю с отметки времени, а затем с «моего файла», поскольку это позволяет просматривать файлы в хронологическом порядке, просто упорядочивая имена файлов в алфавитном порядке.
ChristopheD
2
@ChristopheD: Конечно, в этом случае я бы поступил так же. В своем ответе я думал о случае, когда у вас есть несколько версий нескольких разных файлов, и вы хотите, чтобы они были сгруппированы по имени файла.
RichieHindle 08
2
Лично я предпочитаю использовать подчеркивание ( _) вместо двойного тире для разделения частей. (eg My-File_2009-12-31_23-59-59.txt)
Эли Г.
A name_-_2019-11-04--15-04-36.642621403_-_2019-11-04--15-04-36.642622803.extподходит для оболочки Linux. Без часового пояса, но с точностью до наносекунд.
Иван Черный
14

Я бы использовал YYYY-MM-DD HHmmssдля имен файлов, если нет особой потребности в часовых поясах или возможной необходимости синтаксического анализа их в датах ISO; в таких случаях, вероятно, будет предпочтительнее указать дату ISO.

Изменить: часовые пояса никогда не должны требоваться; сохранять все в формате UTC и давать людям знать, что это все в формате UTC, более эффективно, чем указывать часовой пояс всего.

Вы
источник
9
ай, пробелы в именах файлов?
Сагги Малачи
10
Что не так с пробелами?
Joey
41
Да, пробелы отвратительны. Я лично буду выслеживать людей, которые используют пробелы в именах файлов, и забивать их до смерти мокрой веткой сельдерея :-)
paxdiablo
1
@Saggi; ну, я, вероятно, заслужил это, но серьезно - покажите мне одну систему, которая не обрабатывает имена файлов с пробелами? Насколько я понял, здесь не использовались URI, и поэтому я не слишком беспокоюсь о пробелах. Вы, конечно, можете заменить это пространство на что-нибудь еще, например, на подчеркивание или T, но это менее естественно, когда вы его читаете.
You
1
Я проголосую за это (но я бы никогда не использовал пробелы), причина в том, что год из 4 цифр откладывает проблему y2k1 (но не y10k, но кто действительно дает XXXX по этому поводу?).
paxdiablo
8

Вот что я использую:

    private static string CreateMeaningfulFileName(string friendlyName, DateTime date)
    {
        StringBuilder sb = new StringBuilder();
        foreach (string s in friendlyName.Split(new char[] { ' ' }))//remove spaces
        {
            sb.Append(CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower()));//capitalize each segment
        }
        sb.Append("_" + date.ToString("yyyy-MM-dd_HH-mm"));//add date
        return sb.ToString();
    }

Требуется дата и описание. Давайте использовать «Я люблю СОБАК». Результаты в:

ILikeDogs_1999-09-23_18-42

Н-ел
источник
1
Хороший способ разбить дату и время и на 1 символ меньше, чем ответ @ RichieHindle.
Робино
3

Есть ли требование, чтобы метка времени была удобочитаемой? Если нет, вы можете просто использовать DateTime.Ticks.ToString () . Очень точный, сортируемый и без специальных символов.

Дэн Дипло
источник
1
Я стараюсь сделать все понятным для человека, если это вообще возможно. Это одно из главных достоинств таких схем, как нотация JSON. Даже если вы не думаете, что он должен быть удобочитаемым, вы никогда не знаете, хотите ли вы, чтобы он был читаемым человеком позже. Кроме того, это упрощает отладку.
Edan Maor
Ссылка не работает, на что она пошла?
rbatt 02 авг.15,
@rbatt Я думаю, это была временная проблема с MSDN - должна вернуться.
Дэн Дипло
2

Обычно я использую ггггммдд. Если требуется дополнительная точность, он меняется на ггггммддччммсс

Карлтон Дженке
источник
1

Я использую временные метки unix, например. сколько секунд прошло с эпохи. Время в формате UTC. Но угадайте, что вы можете префикс с данными о часовом поясе, если хотите.

дзиндзо
источник