C # DateTime: какую «дату» использовать, когда я использую только «время»? -- c# поле с участием datetime поле с участием time пол Связанный проблема

C# DateTime: What “date” to use when I'm using just the “time”?


31
vote

проблема

русский

Я использую <код> DateTime в c #, чтобы отобразить время. На какую порту даты каждый использует при построении времени?

e.g. Ниже недействительно, потому что нет нулевого месяца или нулевого дня:

 <код> // 4:37:58 PM DateTime time = new DateTime(0, 0, 0, 16, 47, 58);   

Я использую нулевую дату COM?

 <код> // 4:37:58 PM DateTime time = new DateTime(1899, 12, 30, 16, 47, 58);   

или, возможно, SQL Server's's?

 <код> //4:37:58 PM DateTime time = new DateTime(1900, 1, 1, 16, 47, 58);   

Я понимаю, что это произвольно, так как я буду игнорировать участки даты в коде, но все равно было бы приятно использовать:

 <код> DateTime duration = time2 - time1;   

Ответ

Я думаю, что мне нравится minvalue

 <код>  DateTime time = DateTime.MinValue.Date.Add(new TimeSpan(16, 47, 58));   

Примечание: Я не могу использовать <код> TimeSpan , потому что это не хранить время дня. И причина, по которой я знаю, что это потому, что нет способа отображать его содержимое как время.

Что значит сказать, что <код> import sys, os, django sys.path.append("/home/me/something.mydomain.com/") os.environ['DJANGO_SETTINGS_MODULE'] = 'something.settings' def application(environ, start_response): write = start_response('200 OK', [('Content-type', 'text/plain')]) return ["Hello, world!"] 0 записывает a промежуток времени , а не время дня , e.g.:

 <код> import sys, os, django sys.path.append("/home/me/something.mydomain.com/") os.environ['DJANGO_SETTINGS_MODULE'] = 'something.settings' def application(environ, start_response):     write = start_response('200 OK', [('Content-type', 'text/plain')])     return ["Hello, world!"] 1  

Возвращает промежуток времени в формате Часы : минут : секунды , e.g.:

 <код> import sys, os, django sys.path.append("/home/me/something.mydomain.com/") os.environ['DJANGO_SETTINGS_MODULE'] = 'something.settings' def application(environ, start_response):     write = start_response('200 OK', [('Content-type', 'text/plain')])     return ["Hello, world!"] 2  

, а не время:

 <код> import sys, os, django sys.path.append("/home/me/something.mydomain.com/") os.environ['DJANGO_SETTINGS_MODULE'] = 'something.settings' def application(environ, start_response):     write = start_response('200 OK', [('Content-type', 'text/plain')])     return ["Hello, world!"] 3  

Другими словами, существует разница между временным временем и временем. А также реализуйте, что <код> import sys, os, django sys.path.append("/home/me/something.mydomain.com/") os.environ['DJANGO_SETTINGS_MODULE'] = 'something.settings' def application(environ, start_response): write = start_response('200 OK', [('Content-type', 'text/plain')]) return ["Hello, world!"] 4 не предоставляет механизм преобразования промежутка времени во время дня - и есть причина для этого.

Английский оригинал

I'm using a DateTime in C# to display times. What date portion does everyone use when constructing a time?

E.g. the following is not valid because there is no zero-th month or zero-th day:

// 4:37:58 PM DateTime time = new DateTime(0, 0, 0, 16, 47, 58); 

Do I use COM's zero date?

// 4:37:58 PM DateTime time = new DateTime(1899, 12, 30, 16, 47, 58); 

Or perhaps SQL Server's?

//4:37:58 PM DateTime time = new DateTime(1900, 1, 1, 16, 47, 58); 

I realize it's arbitrary, since I'll be ignoring the date portions in code, but it would still be nice to be able to use:

DateTime duration = time2 - time1; 

Answer

I think I like MinValue

 DateTime time = DateTime.MinValue.Date.Add(new TimeSpan(16, 47, 58)); 

Note: I can't use a TimeSpan, because that doesn't store times of the day. And the reason I know that is because there's no way to display its contents as a time.

Which is to say that TimeSpan records a span of time, not a time of day, e.g.:

TimeSpan t = new TimeSpan(16, 47, 58); t.ToString(); 

returns a span of time in the format hours:minutes:seconds, e.g.:

16:47:58 

rather than a time:

4:47:58 PM    (United States) 04:47:58 nm   (South Africa) 4:47:58.MD    (Albania) 16:47:58      (Algeria) 04:47:58 م    (Bahrain) PM 4:47:58    (Singapore) 下午 04:47:58  (Taiwan) 04:47:58 PM   (Belize) 4:47:58 p.m.  (New Zealand) 4:47:58 μμ    (Greece) 16.47.58      (Italy) 오후 4:47:58   (Korea) 04:47:58 ب.ظ  (Iran) ਸ਼ਾਮ 04:47:58   (India) 04:47:58 p.m. (Argentina) etc 

In other words, there is a difference between a timespan, and a time. And also realize that TimeSpan doesn't provide a mechanism to convert a span of time into a time of day - and there is a reason for that.

</div
        
   
   

Список ответов

26
 
vote
vote
Лучший ответ
 

Как насчет datetime.minvalue?

 

what about DateTime.MinValue?

</div
 
 
 
 
8
 
vote

Давайте поможем парням, которые хотят структуру времени:

 <код> /// <summary> /// Time structure /// </summary> public struct Time : IComparable {     private int minuteOfDay;     public static Time Midnight = "0:00";     private static int MIN_OF_DAY = 60 * 24;      public Time(int minuteOfDay)     {         if (minuteOfDay >= (60 * 24) || minuteOfDay < 0)             throw new ArgumentException("Must be in the range 0-1439", "minuteOfDay");         this.minuteOfDay = minuteOfDay;     }      public Time(int hour, int minutes)     {         if (hour < 0 || hour > 23)             throw new ArgumentException("Must be in the range 0-23", "hour");         if (minutes < 0 || minutes > 59)             throw new ArgumentException("Must be in the range 0-59", "minutes");          minuteOfDay = (hour * 60) + minutes;     }      #region Operators     public static implicit operator Time(string s)     {         var parts = s.Split(':');         if (parts.Length != 2)             throw new ArgumentException("Time must be specified on the form tt:mm");         return new Time(int.Parse(parts[0]), int.Parse(parts[1]));     }       public static bool operator >(Time t1, Time t2)     {         return t1.MinuteOfDay > t2.MinuteOfDay;     }     public static bool operator <(Time t1, Time t2)     {         return t1.MinuteOfDay < t2.MinuteOfDay;     }     public static bool operator >=(Time t1, Time t2)     {         return t1.MinuteOfDay >= t2.MinuteOfDay;     }     public static bool operator <=(Time t1, Time t2)     {         return t1.MinuteOfDay <= t2.MinuteOfDay;     }     public static bool operator ==(Time t1, Time t2)     {         return t1.GetHashCode() == t2.GetHashCode();     }     public static bool operator !=(Time t1, Time t2)     {         return t1.GetHashCode() != t2.GetHashCode();     }      /// Time     /// Minutes that remain to     /// Time conferred minutes     public static Time operator +(Time t, int min)     {         if (t.minuteOfDay + min < (24 * 60))         {             t.minuteOfDay += min;             return t;         }         else         {             t.minuteOfDay = (t.minuteOfDay + min) % MIN_OF_DAY;             return t;         }     }      public static Time operator -(Time t, int min)     {         if (t.minuteOfDay - min > -1)         {             t.minuteOfDay -= min;             return t;         }         else         {             t.minuteOfDay = MIN_OF_DAY + (t.minuteOfDay - min);             return t;         }     }      public static TimeSpan operator -(Time t1, Time t2)     {         return TimeSpan.FromMinutes(Time.Span(t2, t1));     }     #endregion       public int Hour     {         get         {             return (int)(minuteOfDay / 60);         }     }     public int Minutes     {         get         {             return minuteOfDay % 60;         }     }       public int MinuteOfDay     {         get { return minuteOfDay; }     }      public Time AddHours(int hours)     {         return this + (hours * 60);     }      public int CompareTo(Time other)     {         return this.minuteOfDay.CompareTo(other.minuteOfDay);     }      #region Overrides     public override int GetHashCode()     {         return minuteOfDay.GetHashCode();     }      public override string ToString()     {         return string.Format("{0}:{1:00}", Hour, Minutes);     }     #endregion      ///      /// Safe enumerering - whatever interval applied max days      ///      /// Start time     /// Spring in minutes     ///      public static IEnumerable Range(Time start, int step)     {         return Range(start, start, step);     }      ///      /// Safe enumeration - whatever interval applied max days     ///      public static IEnumerable Range(Time start, Time stop, int step)     {         int offset = start.MinuteOfDay;         for (var i = 0; i < Time.Span(start, stop); i += step)         {             yield return Time.Midnight + (i + offset);         }     }      ///      /// Calculates the number of minutes between t1 and t2     ///      public static int Span(Time t1, Time t2)     {         if (t1 < t2) // same day             return t2.MinuteOfDay - t1.MinuteOfDay;         else // over midnight             return MIN_OF_DAY - t1.MinuteOfDay + t2.MinuteOfDay;     } }   
 

Let's help out the guys who want a Time structure:

/// <summary> /// Time structure /// </summary> public struct Time : IComparable {     private int minuteOfDay;     public static Time Midnight = "0:00";     private static int MIN_OF_DAY = 60 * 24;      public Time(int minuteOfDay)     {         if (minuteOfDay >= (60 * 24) || minuteOfDay < 0)             throw new ArgumentException("Must be in the range 0-1439", "minuteOfDay");         this.minuteOfDay = minuteOfDay;     }      public Time(int hour, int minutes)     {         if (hour < 0 || hour > 23)             throw new ArgumentException("Must be in the range 0-23", "hour");         if (minutes < 0 || minutes > 59)             throw new ArgumentException("Must be in the range 0-59", "minutes");          minuteOfDay = (hour * 60) + minutes;     }      #region Operators     public static implicit operator Time(string s)     {         var parts = s.Split(':');         if (parts.Length != 2)             throw new ArgumentException("Time must be specified on the form tt:mm");         return new Time(int.Parse(parts[0]), int.Parse(parts[1]));     }       public static bool operator >(Time t1, Time t2)     {         return t1.MinuteOfDay > t2.MinuteOfDay;     }     public static bool operator <(Time t1, Time t2)     {         return t1.MinuteOfDay < t2.MinuteOfDay;     }     public static bool operator >=(Time t1, Time t2)     {         return t1.MinuteOfDay >= t2.MinuteOfDay;     }     public static bool operator <=(Time t1, Time t2)     {         return t1.MinuteOfDay <= t2.MinuteOfDay;     }     public static bool operator ==(Time t1, Time t2)     {         return t1.GetHashCode() == t2.GetHashCode();     }     public static bool operator !=(Time t1, Time t2)     {         return t1.GetHashCode() != t2.GetHashCode();     }      /// Time     /// Minutes that remain to     /// Time conferred minutes     public static Time operator +(Time t, int min)     {         if (t.minuteOfDay + min < (24 * 60))         {             t.minuteOfDay += min;             return t;         }         else         {             t.minuteOfDay = (t.minuteOfDay + min) % MIN_OF_DAY;             return t;         }     }      public static Time operator -(Time t, int min)     {         if (t.minuteOfDay - min > -1)         {             t.minuteOfDay -= min;             return t;         }         else         {             t.minuteOfDay = MIN_OF_DAY + (t.minuteOfDay - min);             return t;         }     }      public static TimeSpan operator -(Time t1, Time t2)     {         return TimeSpan.FromMinutes(Time.Span(t2, t1));     }     #endregion       public int Hour     {         get         {             return (int)(minuteOfDay / 60);         }     }     public int Minutes     {         get         {             return minuteOfDay % 60;         }     }       public int MinuteOfDay     {         get { return minuteOfDay; }     }      public Time AddHours(int hours)     {         return this + (hours * 60);     }      public int CompareTo(Time other)     {         return this.minuteOfDay.CompareTo(other.minuteOfDay);     }      #region Overrides     public override int GetHashCode()     {         return minuteOfDay.GetHashCode();     }      public override string ToString()     {         return string.Format("{0}:{1:00}", Hour, Minutes);     }     #endregion      ///      /// Safe enumerering - whatever interval applied max days      ///      /// Start time     /// Spring in minutes     ///      public static IEnumerable Range(Time start, int step)     {         return Range(start, start, step);     }      ///      /// Safe enumeration - whatever interval applied max days     ///      public static IEnumerable Range(Time start, Time stop, int step)     {         int offset = start.MinuteOfDay;         for (var i = 0; i < Time.Span(start, stop); i += step)         {             yield return Time.Midnight + (i + offset);         }     }      ///      /// Calculates the number of minutes between t1 and t2     ///      public static int Span(Time t1, Time t2)     {         if (t1 < t2) // same day             return t2.MinuteOfDay - t1.MinuteOfDay;         else // over midnight             return MIN_OF_DAY - t1.MinuteOfDay + t2.MinuteOfDay;     } } 
</div
 
 
 
 
7
 
vote

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

 

A TimeSpan most certainly can store the time of the day - you just have to treat the value as the amount of time elapsed since midnight, basically the same way we read a clock.

</div
 
 
 
 
6
 
vote

Лично я создал пользовательский <код> Time <код> cd ~ mkdir src cd src git clone https://github.com/nshah/werkzeug-debugger-appengine.git cd werkzeug-debugger-appengine python setup.py install 0 , который содержит cd ~ mkdir src cd src git clone https://github.com/nshah/werkzeug-debugger-appengine.git cd werkzeug-debugger-appengine python setup.py install 1 экземпляра, и который имеет аналогичные свойства, конструкторы и т. Д., но не выставить дни / месяцы / и т. Д. Просто сделайте все свои публичные доступа проходят через содержащийся в содержащийся экземпляр. Тогда вы можете просто иметь эпоху в качестве <код> cd ~ mkdir src cd src git clone https://github.com/nshah/werkzeug-debugger-appengine.git cd werkzeug-debugger-appengine python setup.py install 2 поле, и не имеет значения, какое значение вы выбираете, так как все аккуратно содержится в вашем пользовательской структуре. В остальной части вашего кода можно просто написать:

 <код> cd ~ mkdir src cd src git clone https://github.com/nshah/werkzeug-debugger-appengine.git cd werkzeug-debugger-appengine python setup.py install 3  
 

Personally I'd create a custom Time struct that contains a DateTime instance, and which has similar properties, constructors etc. but doesn't expose days/months/etc. Just make all your public accessors pass through to the contained instance. Then you can simply have the epoch as a private static readonly DateTime field and it doesn't matter what value you choose as it's all neatly contained within your custom struct. In the rest of your code can simply write:

var time = new Time(16, 47, 58); 
</div
 
 
4
 
vote

Учитывая, что dateTime.timeofday возвращает Timepan, я бы использовал это.

Почему вы не можете использовать Timepan? Я не понимаю ваш комментарий, что он не хранят время дня.

 

Given that DateTime.TimeOfDay returns a TimeSpan, I'd use that.

Why can't you use a TimeSpan? I don't understand your comment that it doesn't store times of day.

</div
 
 
3
 
vote

Как насчет DateTime.Now.TimeOfDay и используйте <код> TimeSpan ?

Re ", потому что это не хранить время дня." - Ну, он делает, если вы думаете о <код> TimeSpan как время с полуночи.

«Продолжительность», например, кричит <код> TimeSpan .

 

How about DateTime.Now.TimeOfDay, and use the TimeSpan?

Re "because that doesn't store times of the day." - well, it does if you think of a TimeSpan as the time since midnight.

A "duration", for example, screams TimeSpan.

</div
 
 
 
 
3
 
vote

Чтобы отобразить Timepan, отформатированный с локальной культурой, просто добавьте его на дату, как DateTime.today. Что-то вроде этого:

(datetime.today + timepan) .tostring ();

Поскольку ваше значение действительно не представляет дату, вам лучше хранить его в качестве временного интервала, пока не будет отображаться время.

 

To display a TimeSpan formatted with local culture, simply add it to a date like DateTime.Today. Something like this:

(DateTime.Today + timeSpan).ToString();

Since your value really doesn't represent a date, you're better off storing it as a TimeSpan until the time comes to display it.

</div
 
 
1
 
vote

Я рекомендую <код> DateTime.MinValue

 

I recommend DateTime.MinValue

</div
 
 
1
 
vote

Вы можете просто создать новое значение dateTime со строковым литералом.

Строка буквальный за время:

 <код> DateTime t = new DateTime("01:00:30");   

Строка литерала на дату:

 <код> DateTime t = new DateTime("01/05/2008"); // english format DateTime t = new DateTime("05.01.2008"); // german format   

Для данных dateTime с дата и временными значениями:

 <код> DateTime t = new DateTime("01/05/2008T01:00:30");   

В большинстве случаев при создании dateTime я устанавливаю его в dateTime.now, если оно на самом деле не установлено ничего другого. Если вы создали пристройку TANETIME вручную, вы должны правильно остерегаться набора DateTimekind, в противном случае это может привести к сюрпризам.

 

You can just create a new DateTime with a string literal.

String literal for time:

DateTime t = new DateTime("01:00:30"); 

String literal for date:

DateTime t = new DateTime("01/05/2008"); // english format DateTime t = new DateTime("05.01.2008"); // german format 

For a DateTime with date and time values:

DateTime t = new DateTime("01/05/2008T01:00:30"); 

In most cases, when creating a DateTime, i set it to DateTime.Now, if it is not actually set to anything else. If you instantiate an DateTime manually, you should beware of the DateTimeKind set correctly, otherwise this could lead to surprises.

</div
 
 
1
 
vote

Могу я предложить, что в некоторых случаях может сделать пользовательскую структуру? Это может иметь величину резервного копирования int32 (в течение дня есть 86 миллионов; это будет соответствовать в INT32).

Там могут быть получение только свойства:

часы Минут Секунды Миллисекунды

Вы также можете перегружать операторы, такие как +, - и так далее. Реализуйте Iequatable, Imparable и все возможное. Перегрузка равно, ==. Перегрузка и переопределение TOSTRING.

Вы также можете предоставить больше методов для создания от DateTime или добавления к DateTime и так далее.

 

May I suggest that in some cases a custom struct could do? It could have an Int32 backing value (there are 86 milion milliseconds in a day; this would fit in an Int32).

There could be get-only properties :

Hours Minutes Seconds Milliseconds

You could also overload operators such as +, - and so on. Implement IEquatable, IComparable and whatever may be the case. Overload Equals, == . Overload and override ToString.

You could also provide more methods to construct from a DateTime or append to a datetime and so on.

</div
 
 
0
 
vote

Используйте TimePAN и сделайте его UTC, если у вас есть проблемы с часовым поясом.

 

Use a TimeSpan, and make it UTC if you have TimeZone issues.

</div
 
 
0
 
vote

Большая большая разница сравнить с принятым ответом. Просто для реализации идеи.

 <код> public class TimeOfDay {     public DateTime time;     public TimeOfDay(int Hour, int Minute, int Second)     {         time = DateTime.MinValue.Date.Add(new TimeSpan(Hour, Minute, Second));     } }   
 

No much difference compare to the accepted answer. Just to implement the idea.

public class TimeOfDay {     public DateTime time;     public TimeOfDay(int Hour, int Minute, int Second)     {         time = DateTime.MinValue.Date.Add(new TimeSpan(Hour, Minute, Second));     } } 
</div
 
 

Связанный проблема

0  .NET Условно используют библиотеку .NET, если установлено  ( Net conditionally use a net library if installed ) 
Мой вопрос довольно просто. Я хочу добавить новый раздел в мой проект, который будет использоваться библиотеки SMO ​​.NET (объект управления SQL Server). Я сч...

-6  Linux и CSHARP, проверьте, если файл / папка не существует в Linux, если так, запустите mkdir через csharp ssh - [закрыто]  ( Linux and csharp check if file folder doesnt exist in linux if so run mkdir ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт . Этот вопрос нуждается в Детали или ясность . В настоящее...

14  Datagridviewcomboboxcolumn Добавление различных элементов к каждой строке  ( Datagridviewcomboboxcolumn adding different items to each row ) 
Я создаю таблицу, используя datagridview, где пользователь может выбрать элементы из раскрывающегося списка в каждой ячейке. Чтобы упростить проблему, давайте...

0  Обновление данных с той же первичным ключом  ( Updating data with same primary key ) 
Я читаю данные из файла CSV и добавление данных в базу данных. Во время вставки данных в базу данных я хочу обновить данные с той же первичной клавишей. e.g...

0  Что это за кодирование? (Найдено в Outlook / filitory)  ( What is this encoding found in outlook filesite ) 
Я работаю над Addin Outlook VSTO, который будет подключать аддин для файлового файла imagiate, я в настоящее время пытаюсь получить доступ к идентификатору в ...

-2  Группировка результатов от XPathSelectelements в C #  ( Grouping results from xpathselectelements in c sharp ) 
У меня есть XML в следующей структуре <код> <root> <Node> <value>a</value> <value>b</value> <value>c</value> </Node> ...

2  Исключить одно поле из NHB грязной оптимистической блокировки  ( Exclude one field from nhb dirty optimistic locking ) 
Мы устанавливаем наши обновления сущностей с грязным оптимистичным блокировкой в ​​конфигурации NHB: <код> .Override<OurEntity>(x => { x.DynamicUpdate()...

1  Очистка C # код  ( Cleaning up c sharp code ) 
Есть ли какой-нибудь инструмент, который очищает C # .NET кода всех комментариев, отладки, документацию при развертывании его на сервер? Я хочу использовать...

3  Как я могу использовать список?  ( How can i use listdictionary ) 
Я могу заполнить мой список listdicticatic, но, если запущена ошибка, возвращается мне в "Foreach (kne ky ky в ld.keys)" (исключение недействительной операции...

1  C # Словарь <Объект, t> Значение поиска  ( C sharp dictionaryobject t lookup value ) 
Не уверены, как лучшее фразу, наверное, это, вероятно, почему у меня трудно посмотреть это. Вот приложение для пробной консоли для демонстрации моего значения...

3  OnleftClick & OnrightClick JavaScript Функции  ( Onleftclick onrightclick javascript functions ) 
В моем боковом коде сервера я динамически строим таблицу и именно сейчас я добавляю следующий код, чтобы обрабатывать Щелчок строки. <код> tr.Attributes.Add...

0  Каркас экспорта данных или инструменты  ( Data export framework or tools ) 
Есть ли какие-либо данные экспорта данных в .NET или что-то. Мне нужно устройство набора инструментов для экспорта наследие и данных из более старых / устарев...

9  Ответ ASP.NET.redirect с jQuery Mobile - URL-хешированием  ( Asp net response redirect with jquery mobile url hashing ) 
У меня есть стандартные формы Auth Asp.net приложение. Моя регистрация и страница входа в систему находятся в одном файле .aspx с 2 мобильными страницами jQue...

14  Структура космического эффекта в памяти для отсортированного текста поддерживает префикс поиска  ( Space efficient in memory structure for sorted text supporting prefix searches ) 
У меня есть проблема: мне нужен космический поиск файловой системы, основанных на префиксе файлового пути. Преобразование поиска отсортированного текста, друг...

0  Причина определенных ограничений на преобразования дисперсии в C #  ( Reason for certain restrictions on variance conversions in c sharp ) 
У меня есть несколько вопросов о том, как неявные преобразования между методом делегатов в отношении ковариации и контравариации реализуются в C #. <код> de...

Связанный проблема

0  .NET Условно используют библиотеку .NET, если установлено 
-6  Linux и CSHARP, проверьте, если файл / папка не существует в Linux, если так, запустите mkdir через csharp ssh - [закрыто] 
14  Datagridviewcomboboxcolumn Добавление различных элементов к каждой строке 
0  Обновление данных с той же первичным ключом 
0  Что это за кодирование? (Найдено в Outlook / filitory) 
-2  Группировка результатов от XPathSelectelements в C # 
2  Исключить одно поле из NHB грязной оптимистической блокировки 
1  Очистка C # код 
3  Как я могу использовать список? 
1  C # Словарь <Объект, t> Значение поиска 
3  OnleftClick & OnrightClick JavaScript Функции 
0  Каркас экспорта данных или инструменты 
9  Ответ ASP.NET.redirect с jQuery Mobile - URL-хешированием 
14  Структура космического эффекта в памяти для отсортированного текста поддерживает префикс поиска 
0  Причина определенных ограничений на преобразования дисперсии в C #