DateTime'da saat nasıl değiştirilir?


354

DateTime"S" değişkenimdeki zamanı nasıl değiştirebilirim ?

DateTime s = some datetime;

Yanıtlar:


599

Bir DateTime değerini değiştiremezsiniz - değişmez. Ancak, değişkeni yeni bir değere sahip olacak şekilde değiştirebilirsiniz. Bunu sadece zamanı değiştirmek için yapmanın en kolay yolu, ilgili zamana sahip bir TimeSpan oluşturmak ve DateTime.Date özelliğini kullanmaktır:

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

s şimdi aynı tarihte olacak, ancak saat 10.30'da.

DateTimeHer iki yönde "naif" Gregoryen zamanı temsil eden yaz saati geçişlerini göz ardı ettiğini unutmayın ( DateTimedokümanlardaki Açıklamalar bölümüne bakın ). Tek istisna vardır .Nowve .Today: bunlar ortaya çıktıkça bu olayları yansıtan geçerli sistem saati almak.

Bu, beni şimdi üretime hazır olan Noda Time projesini başlatmaya motive eden bir şey . Onun ZonedDateTimetipi "farkında" yapıldığı bir bağlayarak tzveri tabanı girişi .


11
s.Date.Add (yeni TimeSpan (0, 0, 0)) da çalışmalıdır. Günler arasında kontrol yaparken zamanı boş bırakmak için kullanın.
Bilge Yoğurt

9
@ user295734: Neden Addsıfır zaman aralığı sağlamayı çağırıyorsunuz ? İfadeniz eşdeğer s.Date, ancak daha uzun ...
Jon Skeet

Düzeltmek için unuttum, sıfıra (başlangıçta ne aradığını) ayarlamak için, kod koyduktan sonra fark etti. Ama ben sadece 0'a ayarlayarak değilse, tek satırda bir zaman setialabileceğini nasıl göstermeye çalıştığını
Yoğurt Arifler

3
2 DateTimes'niz varsa (bir tarih ve bir saat için) bunu yapabilirsiniz:var result = date.Date + time.TimeOfDay;
Zachary Yates

2
@ZacharyYates: Evet, ancak bu noktada modelinizin başlamak için kırıldığını ve bir timeolmamalı olduğunu iddia etsem de DateTime. (Elbette Noda Time'ı kullanırdım, ama ...)
Jon Skeet

100

Tamam, benim önerim, bir uzatma yöntemi ile dalış:

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);
}

Sonra ara:

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

Bu uzantının yeni bir tarih nesnesi döndürdüğüne dikkat etmek önemlidir , bu nedenle bunu yapamazsınız:

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

Ancak bunu yapabilirsiniz:

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

6
Bu aslında ile aynıdır Datetime.Today.Add(time.TimeOfDay). Çünkü dahili olarak, yapıcı, tarih bölümü için bir artık yılı hesaplamak dışında herhangi bir takvim tabanlı düzeltme yapmaz. Yani DateTimePython'un datetimemodülü açısından "naif" bir uygulamadır .
ivan_pozdeev

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

Bu şekilde, beğeninize yeni bir saat, dakika ve saniye parçası eklerken tarihinizi korursunuz.


@Webleeuw Tabii ki, eklenen değerlere bağlı olarak uzaktan ArgumentOutOfRangeException olasılığı . İşte bunu gösteren bir Pex bulmacası.
cankurtaran

Ve kullanım durumuna bağlı olarak, .AddMilliseconds()gerekirse de yapabilirsiniz .
Broots Waymb

41

bir astar

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

Bugünün tarihini 4:30:00 ile geri getirecek, DateTime.Now yerine herhangi bir tarih nesnesiyle


22

DateTime değişmez bir tiptir, bu yüzden değiştiremezsiniz .

Ancak, önceki örneğinize dayalı olarak yeni bir DateTime örneği oluşturabilirsiniz. Sizin durumunuzda, Date özelliğine ihtiyacınız olduğu anlaşılıyor ve günün saatini temsil eden bir TimeSpan ekleyebilirsiniz.

Bunun gibi bir şey:

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

17

Zaten başka bir DateTimenesnede depolanmış zamanınız varsa Addyöntemi kullanabilirsiniz .

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Özelliği a, TimeSpannesne ve geçirilebilir Addyöntem. Ve değişkenin Dateözelliğini kullandığımız dateToUseiçin sadece tarihi alırız ve zaman aralığını ekleriz.


16

En basit çözüm:

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);

Belirli bir Tarih ve Saat Biçimine ihtiyacınız varsa:

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") ) ;

Yürütüldü: Bugün = 9/04/15 00:00:00


8

Bu yazı muhtemelen bu adam istediğini yapabilirdi aynı işlevselliği arıyordum oldu. Orijinal tarihi alın ve saat bölümünü değiştirin

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

4

Beri DateTimedeğişmez, yeni örneği bir tarih bileşeni değişmesi gerekirse oluşturulan gerekmektedir. Ne yazık ki, bir bileşenin bireysel bileşenlerini ayarlamak için yerleşik bir işlevsellik yokturDateTime örneğin .

Aşağıdaki uzantı yöntemlerini kullanma

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);
}

DateTimegibi bileşenleri tek tek ayarlayabilirsiniz

var now = DateTime.Now;

now.SetSecond(0);

3

2014/02/05 18:19:51 gibi bir DateTime'ınız varsa ve sadece 2014/02/05 istiyorsanız, bunu yapabilirsiniz:

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

3

Tarihinize tarih eklemek, gece yarısına (00:00) ayarlanır.

MyDate.Date

Not Eşdeğer SQLCONVERT(DATETIME, CONVERT(DATE, @MyDate))

Bu yöntemi bu kadar iyi yapan şey hem yazmanın hızlı hem de okunması kolay olmasıdır. Bonus, dizelerden dönüşüm olmamasıdır.

Yani Bugünün tarihini 23: 30'a ayarlamak için şunu kullanın:

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

Tabii ki DateTime.Now veya MyDate'i istediğiniz herhangi bir tarihle değiştirebilirsiniz.



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);

2

Date.AddEklemek New TimeSpanistediğiniz yeni saatle a kullanın ve ekleyin

DateTime dt = DateTime.Now
dt.Date.Add(new TimeSpan(12,15,00))

1

Eğer inşa zaman DateTimenesne, zamanı belirlemenizi sağlar bir kurucu kullanabilirsiniz:

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

Zaten bir DateTimenesneniz varsa ve saati değiştirmek istiyorsanız, DateTimebasit yöntemleri kullanarak dakika, saat veya saniye ekleyebilirsiniz :

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

myDateTimeDeğişken için yapılan her yöntem çağrısının sonucunu nasıl "kaydetmemiz" gerektiğine dikkat edin . Bunun nedeni DateTime, değişmez olması ve yöntemlerinin, fazladan saat / dakika / saniye ekleyerek yeni örnekler oluşturmasıdır.

Hem saat hem de dakika (ve / veya saniye) ve aynı zamanda eklemeniz TimeSpangerekiyorsa, DateTimebunun yerine orijinaline a ekleyerek kodu basitleştirebilirsiniz :

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

Varolan değerlere eklemek yerine mutlak saat / dakika / saniye ayarlamak istiyorsanız, yukarıda belirtilen yapıcıyı kullanabilir DateTimeve yıl / ay / gün değerlerini daha önce yeniden kullanabilirsiniz:

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

AddXXX yöntemlerini kullanarak ekleme ve çıkarma
Chris Richner

1

İşte sizin için yapmak için kullanabileceğiniz bir yöntem, böyle kullanın

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

İşte yöntem, muhtemelen daha iyi bir yol var, ama ben sadece bu kadar çırpılmış:

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

Ben sadece bu yazı rastladım çünkü zaman bileşeni 00:00:00 böylece MVC bir görünümden (datepicker) tarih alır bir Entity Framework nesnesi için zaman ayarlamak istedim benzer bir sorun vardı ama ihtiyacım var şimdiki zaman olmak. Bu yazıdaki cevaplara dayanarak:

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

Yeni bir DateTimedeğere birçok farklı yolla bir başlangıç ​​değeri atayabilirsiniz :

  • Genişletme Yöntemi

Genişletme yöntemi 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);
    }

sonra kullanarak ChangeTime:

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.ChangeTime(12, 20, 10);
  • Add yöntemlerini kullanarak

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.Date.AddHours(12).AddMinutes(20).AddSeconds(10);
  • Timespan'ı kullanma

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.Date.Add(new TimeSpan(12, 20, 10));
  • başlangıç ​​değerini kullanma

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

0

Saniyeler ekleyebileceğiniz veya alt özet ekleyebileceğiniz DateTime.AddSeconds yönteminde sorun nedir?


Sadece bu da değil, soruyu yine de cevaplıyormuş gibi gelmiyor. Ben OP aynı tarih ama belirli bir saat ile bir DateTime istiyor şüpheli - ki bu sadece AddSeconds kullanarak yapmak nispeten zor olurdu .
Jon Skeet

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

parametreye + ve / -ve değerleri ekleyebilirsiniz.

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

@Jon: Çizgiyi yorumladım. kullanıcının bu kodu kullanmadan önce bir değer ataması gerekir.
Saar

@Saar: Daha da önemlisi, ödevleri şimdi s'ye eklediniz (s.Add (...) çağrısı hariç).
Jon Skeet

@Jon: Dersimi öğrendim. Nezaketiniz ve zamanınız için teşekkürler. Gerçekten onu kastediyorum.
Saar

0

Bu sorunlarınızı düzeltmiyor mu?

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

0

Bunu tercih ederim:

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;

        }

Bunun gibi kullanın:

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

bunun geri dönmesi gerekiyor: 2016-06-06 00: 00: 00.000


-1

En iyi çözüm:

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

1
İlk I azından bu yanlış olduğunu düşündüm, ama mantıklı eğer bir DateTime nesnesine sonucunu atar. Yine de en iyi çözüm değil. Tarihin Tarih bölümünü alırken ve en iyisi eklerken, doğru hesaplamaları yapmak için geçerli Saat bölümünü bilmenizi gerektirir.
ThunderGr

1
Kesinlikle "en iyi" değil. Okunabilir ve sihirli bir sayının tekrar tekrar kullanımı ile.
BartoszKP

-1

Bunu dene

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

-5

İşte bir getto yolu, ama işe yarıyor :)

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));

Başka bir getto yolu ama biraz daha temiz sadece saniyeler içinde oynamak olacaktır. örneğin dt.AddSeconds(0-dt.Seconds).AddSeconds(newSecondsValue)ama bunu tavsiye etmem.
mike
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.