Як змінити час у DateTime?


353

Як я можу змінити лише час у своїй DateTimeзмінній "s"?

DateTime s = some datetime;

Відповіді:


598

Ви не можете змінити значення DateTime - воно незмінне. Однак ви можете змінити змінну, щоб мати нове значення. Найпростіший спосіб змінити саме час - це створити TimeSpan з відповідним часом і використовувати властивість DateTime.Date:

DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;

s тепер буде та сама дата, але о 10.30 ранку.

Зауважте, що DateTimeнехтуєте переходами літнього часу, що представляють "наївний" григоріанський час в обох напрямках (див. Розділ "Зауваження" в DateTimeдокументах ). Виняток становить лише .Nowта .Today: вони отримати поточний системний час , яке відображає ці події , як вони відбуваються.

Саме така річ мотивувала мене розпочати проект Noda Time , який зараз готовий до виробництва. Її ZonedDateTimeтип стає "відомим" , пов'язуючи його із записом tzбази даних .


11
s.Date.Add (новий TimeSpan (0, 0, 0)) також повинен працювати. Використовуючи його, щоб зняти час при перевірці між днями.
Йогурт Мудрий

8
@ user295734: Чому ви б закликали Addнадавати нульовий проміжок часу? Ваше вираження рівносильно s.Date, але довше ...
Джон Скіт

Забув виправити це, зрозумів це після того, як я вклав його в код, для встановлення нуля (що я спочатку шукав). Але я просто намагався показати, як отримати час, встановлений в одному рядку, якщо не встановити 0.
Йогурт Мудрий

3
Якщо у вас є 2 DateTimeс (один на побачення і один на час), ви можете зробити це:var result = date.Date + time.TimeOfDay;
Захарій Яйт

2
@ZacharyYates: Так, хоча я б стверджував, що в цей момент ваша модель порушена для початку, і timeне повинна бути DateTime. (Я б використовував Noda Time, звичайно, але ...)
Джон Скіт

100

Добре, я занурююсь із своєю пропозицією, методом розширення:

public static DateTime ChangeTime(this DateTime dateTime, int hours, int minutes, int seconds, int milliseconds)
{
    return new DateTime(
        dateTime.Year,
        dateTime.Month,
        dateTime.Day,
        hours,
        minutes,
        seconds,
        milliseconds,
        dateTime.Kind);
}

Потім зателефонуйте:

DateTime myDate = DateTime.Now.ChangeTime(10,10,10,0);

Важливо зазначити, що це розширення повертає новий об'єкт дати, тому ви не можете цього зробити:

DateTime myDate = DateTime.Now;
myDate.ChangeTime(10,10,10,0);

Але ви можете це зробити:

DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);

6
Це по суті те саме, що Datetime.Today.Add(time.TimeOfDay). Це тому, що внутрішньо конструктор не робить ніяких виправлень на основі календаря, за винятком обліку високосного року для частини дати. Тобто DateTimeце "наївна" реалізація з точки зору datetimeмодуля Python .
ivan_pozdeev

68
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);

Таким чином ви зберігаєте свою дату, вставляючи при цьому нову частину годин, хвилин та секунд на свій смак.


@Webleeuw Звичайно, віддалена можливість ArgumentOutOfRangeException залежно від доданих значень. Ось головоломка Пекса, яка демонструє це.
життєвий баланс

І залежно від випадку використання, також може робити .AddMilliseconds()при необхідності.
Broots Waymb

40

один лайнер

var date = DateTime.Now.Date.Add(new TimeSpan(4, 30, 0));

поверне сьогоднішню дату з часом 4:30:00, замінить DateTime.Зараз будь-яким об’єктом дати


22

DateTime - це непорушний тип, тому ви не можете його змінити .

Однак ви можете створити новий екземпляр DateTime на основі попереднього примірника. У вашому випадку це здається, що вам потрібна властивість Date, і ви можете додати TimeSpan, який представляє час доби.

Щось на зразок цього:

var newDt = s.Date + TimeSpan.FromHours(2);

17

Якщо у вас вже є час, що зберігається в іншому DateTimeоб'єкті, ви можете скористатися Addметодом.

DateTime dateToUse = DateTime.Now();
DateTime timeToUse = new DateTime(2012, 2, 4, 10, 15, 30); //10:15:30 AM

DateTime dateWithRightTime = dateToUse.Date.Add(timeToUse.TimeOfDay);

TimeOfDayВластивість є TimeSpanоб'єктом і може бути переданий Addметоду. А оскільки ми використовуємо Dateвластивість dateToUseзмінної, ми отримуємо просто дату та додаємо проміжок часу.


16

Найпростіше рішення:

DateTime s = //some Datetime that you want to change time for 8:36:44 ;
s = new DateTime(s.Year, s.Month, s.Day, 8, 36, 44);

А якщо вам потрібен певний формат дати та часу:

s = new DateTime(s.Year, s.Month, s.Day, 8, 36, 44).ToString("yyyy-MM-dd h:mm:ss");

9
DateTime ts = DateTime.Now;
ts = new DateTime ( ts.Year, ts.Month, ts.Day, 0, 0, 0 ) ;
Console.WriteLine ( "Today = " + ts.ToString("M/dd/yy HH:mm:ss") ) ;

Виконано: сьогодні = 9.04.15 00:00:00


8

Це сталося, коли я шукав ту саму функціональність, яка, можливо, могла б зробити те, що хотів хлопець. Візьміть початкову дату та замініть частину часу

DateTime dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM");

4

Оскільки DateTimeє незмінним, слід створити новий екземпляр, коли потрібно змінити компонент дати. На жаль, не існує вбудованої функціональності для встановлення окремих компонентівDateTime екземпляра.

Використання наступних методів розширення

public static DateTime SetPart(this DateTime dateTime, int? year, int? month, int? day, int? hour, int? minute, int? second)
{
    return new DateTime(
        year ?? dateTime.Year,
        month ?? dateTime.Month,
        day ?? dateTime.Day,
        hour ?? dateTime.Hour,
        minute ?? dateTime.Minute,
        second ?? dateTime.Second
    );
}

public static DateTime SetYear(this DateTime dateTime, int year)
{
    return dateTime.SetPart(year, null, null, null, null, null);
}

public static DateTime SetMonth(this DateTime dateTime, int month)
{
    return dateTime.SetPart(null, month, null, null, null, null);
}

public static DateTime SetDay(this DateTime dateTime, int day)
{
    return dateTime.SetPart(null, null, day, null, null, null);
}

public static DateTime SetHour(this DateTime dateTime, int hour)
{
    return dateTime.SetPart(null, null, null, hour, null, null);
}

public static DateTime SetMinute(this DateTime dateTime, int minute)
{
    return dateTime.SetPart(null, null, null, null, minute, null);
}

public static DateTime SetSecond(this DateTime dateTime, int second)
{
    return dateTime.SetPart(null, null, null, null, null, second);
}

ви можете встановити окремі DateTimeкомпоненти, як

var now = DateTime.Now;

now.SetSecond(0);

3

Якщо у вас є така дата, як 2014/02/05 18:19:51, і ви хочете просто 2014/02/05, ви можете зробити це:

_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)

3

Додавання .Дати до дати визначає її опівночі (00:00).

MyDate.Date

Примітка Еквівалентний SQL єCONVERT(DATETIME, CONVERT(DATE, @MyDate))

Що робить цей метод настільки хорошим, це те, що він одночасно швидко набирається та легко читається. Бонусом є те, що не відбувається перетворення рядків.

Тобто Щоб встановити сьогоднішню дату на 23:30, використовуйте:

DateTime.Now.Date.AddHours(23).AddMinutes(30)

Звичайно, ви можете замінити DateTime.Now або MyDate на будь-яку бажану дату.


3

Насправді ви не можете змінити час, коли він створений. Але ви можете легко створити його за допомогою багатьох конструкторів: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2

Наприклад, якщо ви хочете створити DateTime, що змінюється секундами, ви можете просто зробити це:

DateTime now = DateTime.Now;
DateTime secondschanged = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, yourseconds);

2
int year = 2012;
int month = 12;
int day = 24;
int hour = 0;
int min = 0;
int second = 23;
DateTime dt = new DateTime(year, month, day, hour, min, second);


1

Створюючи DateTimeоб'єкт, використовуйте конструктор, який дозволяє задавати час:

var myDateTime = new DateTime(2000, 01, 01, 13, 37, 42);  // 2000-01-01 13:37:42

Якщо у вас вже є DateTimeоб’єкт і хочете змінити час, uou може додати хвилини, години або секунди до своїх, DateTimeвикористовуючи прості методи:

var myDateTime = new DateTime(2000, 01, 01);              // 2000-01-01 00:00:00
myDateTime = myDateTime.AddHours(13);                     // 2000-01-01 13:00:00
myDateTime = myDateTime.AddMinutes(37);                   // 2000-01-01 13:37:00
myDateTime = myDateTime.AddSecounds(42);                  // 2000-01-01 13:37:42

Зауважте, як нам потрібно "зберегти" результат від кожного виклику методу до myDateTimeзмінної. Це пояснюється тим, що DateTimeфункція непорушна, і її методи просто створюють нові екземпляри з додаванням додаткових годин / хвилин / секунд.

Якщо вам потрібно додати і години, і хвилини (і / або секунди), і той самий час, ви можете спростити код, додавши замість TimeSpanоригіналу a DateTime:

var myDateTime = new DateTime(2000, 01, 01);              // 2000-01-01 00:00:00
myDateTime += new TimeSpan(13, 37, 42);                   // 2000-01-01 13:37:42

Якщо ви хочете встановити абсолютні години / мінуси / секунди, а не додавати до існуючих значень, ви можете використовувати вищезгаданий DateTimeконструктор і повторно використовувати значення для року / місяця / дня з попереднього:

myDateTime = new DateTime(myDateTime.Year, myDateTime.Month, myDateTime.Day,
                          20, 33, 19)                     // 2000-01-01 20:33:19

Додавання і віднімання за допомогою методів AddXXX
Кріс Річнер

1

Ось метод, який ви можете використати, щоб зробити це для вас, використовуйте його так

DateTime newDataTime = ChangeDateTimePart(oldDateTime, DateTimePart.Seconds, 0);

Ось метод, є, мабуть, кращий спосіб, але я просто збився з цього:

public enum DateTimePart { Years, Months, Days, Hours, Minutes, Seconds };
public DateTime ChangeDateTimePart(DateTime dt, DateTimePart part, int newValue)
{
    return new DateTime(
        part == DateTimePart.Years ? newValue : dt.Year,
        part == DateTimePart.Months ? newValue : dt.Month,
        part == DateTimePart.Days ? newValue : dt.Day,
        part == DateTimePart.Hours ? newValue : dt.Hour,
        part == DateTimePart.Minutes ? newValue : dt.Minute,
        part == DateTimePart.Seconds ? newValue : dt.Second
        );
}

1

Я щойно натрапив на цю посаду, тому що у мене була подібна проблема, з якою я хотів встановити час для об'єкта Entity Framework в MVC, який отримує дату з виду (дата-вибору), тому компонент часу становить 00:00:00, але мені потрібно це теперішній час. На основі відповідей у ​​цій публікації я придумав:

myEntity.FromDate += DateTime.Now.TimeOfDay;

1
//The fastest way to copy time            

DateTime justDate = new DateTime(2011, 1, 1); // 1/1/2011 12:00:00AM the date you will be adding time to, time ticks = 0
DateTime timeSource = new DateTime(1999, 2, 4, 10, 15, 30); // 2/4/1999 10:15:30AM - time tick = x

justDate = new DateTime(justDate.Date.Ticks + timeSource.TimeOfDay.Ticks);

Console.WriteLine(justDate); // 1/1/2011 10:15:30AM
Console.Read();

1

Ви можете призначити початкове значення новому DateTimeзначенню різними способами:

  • Спосіб розширення

Спосіб розширення DateTime

    public static DateTime ChangeTime(this DateTime dateTime, int hours, int minutes, int seconds = default, int milliseconds = default)
    {
        return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, hours, minutes, seconds, milliseconds, dateTime.Kind);
    }

потім використовуючи ChangeTime:

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.ChangeTime(12, 20, 10);
  • використовуючи методи Add

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.Date.AddHours(12).AddMinutes(20).AddSeconds(10);
  • використовуючи Timespan

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.Date.Add(new TimeSpan(12, 20, 10));
  • використовуючи початкове значення

    DateTime datetime = DateTime.Now;
    datetime = new DateTime(datetime.Year, datetime.Month, datetime.Day, 12, 20, 10);

0

Що не так з методом DateTime.AddSeconds, за допомогою якого ви можете додати або відібріти секунди?


Мало того, але це не здається, що це все одно відповідає на питання. Я підозрюю, що ОП хоче DateTime з тією ж датою, але конкретний час - що було б досить важко зробити лише за допомогою AddSeconds.
Джон Скіт

0
  DateTime s;
//s = datevalue
                s = s.AddMilliseconds(10);
                s = s.AddMinutes(10);
                s = s.AddSeconds(10);
                s = s.AddHours(10);

ви можете додати значення + ve / -ve в параметр.

s.Add(new TimeSpan(1, 1, 1));

@Jon: Я прокоментував рядок. перед використанням цього коду користувачеві потрібно призначити якесь значення.
Саар

@Saar: Що ще важливіше, ви тепер додали завдання назад до s (за винятком дзвінка на s.Add (...)).
Джон Скіт

@Jon: Я засвоїв свій урок. Дякуємо за вашу доброту та час. Я це справді маю на увазі.
Саар

0

Хіба це не вирішує ваші проблеми ??

Dateime dt = DateTime.Now;
dt = dt.AddSeconds(10);

0

Я вважаю за краще це:

DateTime s = //get some datetime;
s = new DateTime(s.Year, s.Month,s.Day,s.Hour,s.Minute,0);

0
 Using an extencion to DateTime:  

        public enum eTimeFragment
        {
            hours,
            minutes,
            seconds,
            milliseconds
        }
        public static DateTime ClearTimeFrom(this DateTime dateToClear, eTimeFragment etf)
        {
            DateTime dtRet = dateToClear;
            switch (etf)
            {
                case eTimeFragment.hours:
                    dtRet = dateToClear.Date;
                    break;
                case eTimeFragment.minutes:
                    dtRet = dateToClear.AddMinutes(dateToClear.Minute * -1);
                    dtRet = dtRet.ClearTimeFrom(eTimeFragment.seconds);
                    break;
                case eTimeFragment.seconds:
                    dtRet = dateToClear.AddSeconds(dateToClear.Second * -1);
                    dtRet = dtRet.ClearTimeFrom(eTimeFragment.milliseconds);
                    break;
                case eTimeFragment.milliseconds:
                    dtRet = dateToClear.AddMilliseconds(dateToClear.Millisecond * -1);
                    break;
            }
            return dtRet;

        }

Використовуйте так:

Console.WriteLine (DateTime.Now.ClearTimeFrom (eTimeFragment.hours))

це має повернутись: 2016-06-06 00: 00: 00.000


-1

Найкраще рішення:

currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);

1
Спочатку я подумав, що це неправильно, але має сенс, якщо ви присвоїли результат об’єкту DateTime. Однак це не найкраще рішення. Це вимагає, щоб ви знали поточну частину часу, щоб зробити правильні обчислення, при цьому взявши частину дати і додавши туди найкраще.
ThunderGr

1
Однозначно не "найкраще". Далеко від читабельного та з повторним використанням магічного числа.
BartoszKP

-1

Спробуйте це

var NewDate = Convert.ToDateTime(DateTime.Now.ToString("dd/MMM/yyyy")+" "+"10:15 PM")/*Add your time here*/;

-5

ось гетто спосіб, але він працює :)

DateTime dt = DateTime.Now; //get a DateTime variable for the example
string newSecondsValue = "00";
dt = Convert.ToDateTime(dt.ToString("MM/dd/yyyy hh:mm:" + newSecondsValue));

Ще один спосіб гетто, але трохи чистішим було б просто пограти з секундами. наприклад, dt.AddSeconds(0-dt.Seconds).AddSeconds(newSecondsValue)але не рекомендував би його.
Майк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.