2014-11-03 2 views
10

Я использую много DateTime в своем коде. Я хочу изменить эти DateTimes на конкретную дату и сохранить раз.Как изменить только часть даты DateTime, сохраняя при этом временную часть?

1. "2012/02/02 06:00:00" => "2015/12/12 : 06:00:00" 
2. "2013/02/02 12:00:00" => "2015/12/12 : 12:00:00" 

Я использую этот стиль, чтобы изменить, но это, похоже, не добрый путь, и я хочу спросить, есть какой-либо способ для достижения этой задачи.

DateTime newDateTime = new DateTime(2015,12,12,oldDateTime.Hour,oldDateTime.Minute,0); 
+0

Какую формулу вы используете для расчета нового года, месяца и дня, или вы просто пытаетесь изменить все даты, чтобы иметь ту же дату с исходной частью времени? –

+0

Кроме того, что вы подразумеваете под словом «не лучший способ»? Что не так с текущей реализацией? –

+1

Пока ваш код показывает, как вы создаете новый объект datetime, он не отображает контекст вашего вопроса. например, пытаетесь ли вы распечатать их в этом конкретном формате на консоли или экране? Откуда вы берете первую часть стоимости? Я уверен, что с немного дополнительной информацией многие люди смогут правильно вести вас –

ответ

11

С информацией, предоставленной вами, я думаю, что этот метод в порядке. Если вы не хотите часто переписывать oldDateTime.Hour,oldDateTime.Minute,0, вы можете создать свой собственный статический класс, чтобы упростить вызовы методов.

В вашем регулярном применении:

class Program 
{ 
    static void Main(string[] args) 
    { 
     DateTime time = DateTime.Now; 
     DateTime newDateTime = MyDateTimeUtil.CreateDateFromTime(2015, 12, 12, time); 
    } 
} 

Статический класс, который создает DateTime значение:

public static class MyDateTimeUtil 
{ 
    public static DateTime CreateDateFromTime(int year, int month, int day, DateTime time) 
    { 
     return new DateTime(year, month, day, time.Hour, time.Minute, 0); 
    } 
} 
+0

Спасибо grovesNL! Это хорошая идея с вашим вспомогательным классом. Итак, в этом примере это означает, что в C# нет никакого способа сделать это правильно? – borrom

+0

@borrom: Да, это довольно специализированный запрос, поэтому я бы не ожидал, что класс 'System.DateTime' будет включать этот метод по умолчанию. Все возможные конструкторы DateTime перечислены в [записи MSDN] (http://msdn.microsoft.com/en-us/library/system.datetime (v = vs.110) .aspx). – grovesNL

12

лучший способ, который сохраняет секунды, миллисекунды и меньшие части времени будет:

DateTime newDateTime = new DateTime(2015,12,12) + oldDateTime.TimeOfDay; 

Или вы можете сделать метод расширения применить новую дату к существующему DateTime и в то же время, не доверяйте новую дату, чтобы быть без TimeOfDay на него: -

public static DateTime WithDate (this DateTime datetime, DateTime newDate) 
{ 
    return newDate.Date + datetime.TimeOfDay; 
} 

ИМХО DateTime это один из самых слабых частей .NET. Например, TimeSpan - это не то же самое, что и TimeOfDay, и он не может представлять «TimePeriod» (в месяцах) - это три отдельных понятия, и их смешивание было плохим выбором. Перемещение в DateTimeOffset обычно предпочтительнее или в отличную библиотеку времени Noda.

+0

@ Lan Mercer. Это работает найти! После того, как я попробую ваш код. Спасибо – borrom

+0

Я сделал несколько быстрых тестов и обнаружил, что этот метод занимает 1/6 времени, затрачиваемого на использование 'DateTime (int year, int month, int day, int hour, int minute, int second, int millisecond)' constructor , Также это примерно на 6% быстрее, чем использование 'newDate.Date.AddTicks (datetime.TimeOfDay.Ticks)'. Поэтому, в основном, используйте это. :) – Andrew

Смежные вопросы