Bagaimana cara mengubah waktu di DateTime?


353

Bagaimana saya bisa mengubah hanya waktu dalam DateTimevariabel "s" saya?

DateTime s = some datetime;

Jawaban:


598

Anda tidak dapat mengubah nilai DateTime - tidak dapat diubah. Namun, Anda dapat mengubah variabel untuk memiliki nilai baru. Cara termudah untuk melakukan itu hanya mengubah waktu adalah membuat TimeSpan dengan waktu yang relevan, dan menggunakan properti DateTime.Date:

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

s sekarang akan menjadi tanggal yang sama, tetapi pukul 10.30 pagi.

Perhatikan bahwa DateTimemengabaikan transisi waktu musim panas, mewakili waktu Gregorian "naif" di kedua arah (lihat bagian Keterangan dalam DateTimedokumen ). Satu-satunya pengecualian adalah .Nowdan.Today : mereka mengambil waktu sistem saat ini yang mencerminkan peristiwa ini saat terjadi.

Ini adalah hal yang memotivasi saya untuk memulai proyek Noda Time , yang sekarang sudah siap produksi. Jenisnya ZonedDateTimedibuat "sadar" dengan menautkannya ke tzentri basis data .


11
s.Date.Add (TimeSpan baru (0, 0, 0)) juga harus berfungsi. Menggunakannya untuk membatalkan waktu ketika memeriksa antar hari.
Yogurt The Wise

8
@ user295734: Mengapa Anda menelepon untuk Addmemberikan rentang waktu nol? Ekspresi Anda setara dengan s.Date, tetapi lebih lama ...
Jon Skeet

Lupa memperbaikinya, menyadarinya setelah saya memasukkannya ke dalam kode, untuk pengaturan ke nol (apa yang saya cari pada awalnya). Tapi saya hanya mencoba menunjukkan bagaimana mendapatkan waktu yang ditetapkan dalam satu baris, jika tidak menetapkan ke 0.
Yogurt The Wise

3
Jika Anda memiliki 2 DateTimedetik, (satu untuk tanggal dan satu untuk saat itu) Anda dapat melakukan ini:var result = date.Date + time.TimeOfDay;
Zachary Yates

2
@ ZacharyYates: Ya, meskipun saya berpendapat bahwa pada saat itu model Anda rusak untuk memulai, dan timeseharusnya tidak menjadi DateTime. (Tentu saja saya akan menggunakan Noda Time, tapi ...)
Jon Skeet

100

Baiklah saya menyelam dengan saran saya, metode ekstensi:

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

Lalu hubungi:

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

Penting untuk dicatat bahwa ekstensi ini mengembalikan objek tanggal baru , jadi Anda tidak dapat melakukan ini:

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

Tetapi Anda bisa melakukan ini:

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

6
Ini pada dasarnya sama dengan Datetime.Today.Add(time.TimeOfDay). Itu karena secara internal, konstruktor tidak melakukan koreksi berbasis kalender kecuali menghitung tahun kabisat untuk bagian tanggal. Yaitu DateTimeadalah implementasi "naif" dalam hal datetimemodul Python .
ivan_pozdeev

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

Dengan cara ini Anda mempertahankan tanggal Anda, sambil menyisipkan bagian jam, menit, dan detik baru sesuai keinginan Anda.


@ Webleeuw Tentu saja, kemungkinan jarak jauh dari ArgumentOutOfRangeException tergantung pada nilai tambah. Berikut adalah teka-teki Pex yang menunjukkan ini.
lifebalance

Dan tergantung pada use case, bisa juga dilakukan .AddMilliseconds()jika diperlukan.
Broots Waymb

41

satu liner

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

akan mengembalikan tanggal todays dengan waktu 4:30:00, ganti DateTime. Sekarang dengan objek tanggal


22

DateTime adalah tipe yang tidak bisa diubah, jadi Anda tidak bisa berubah .

Namun, Anda dapat membuat instance DateTime baru berdasarkan instance sebelumnya. Dalam kasus Anda, sepertinya Anda memerlukan properti Date, dan Anda kemudian dapat menambahkan TimeSpan yang mewakili waktu dalam sehari.

Sesuatu seperti ini:

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

17

Jika Anda sudah memiliki waktu yang tersimpan di DateTimeobjek lain, Anda dapat menggunakan Addmetode ini.

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

The TimeOfDayproperti adalah TimeSpanobjek dan dapat diteruskan ke Addmetode. Dan karena kita menggunakan Dateproperti dateToUsevariabel kita hanya mendapatkan tanggal dan menambahkan rentang waktu.


16

Solusi paling sederhana:

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

Dan jika Anda memerlukan Format Tanggal dan Waktu tertentu:

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

Dieksekusi: Hari ini = 9/04/15 00:00:00


8

Terjadi pada posting ini karena saya sedang mencari fungsi yang sama ini mungkin bisa melakukan apa yang diinginkan orang itu. Ambil tanggal asli dan ganti bagian waktu

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

4

Karena DateTimetidak dapat diubah, instance baru harus dibuat ketika komponen tanggal perlu diubah. Sayangnya, tidak ada fungsi bawaan untuk mengatur komponen individual aDateTime instance.

Menggunakan metode ekstensi berikut

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

Anda dapat mengatur DateTimekomponen individual suka

var now = DateTime.Now;

now.SetSecond(0);

3

Jika Anda memiliki DateTime seperti 2014/02/05 18:19:51 dan hanya ingin 2014/02/05, Anda dapat melakukannya:

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

3

Menambahkan. Tanggal ke tanggal Anda menyetelnya ke tengah malam (00:00).

MyDate.Date

Catatan SQL ekuivalen adalahCONVERT(DATETIME, CONVERT(DATE, @MyDate))

Apa yang membuat metode ini begitu baik adalah bahwa cara mengetiknya cepat dan mudah dibaca. Bonusnya adalah tidak ada konversi dari string.

Yaitu Untuk mengatur tanggal hari ini ke 23:30, gunakan:

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

Tentu saja Anda dapat mengganti DateTime. Sekarang atau MyDate dengan tanggal pilihan Anda.



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

Gunakan Date.Adddan tambahkan New TimeSpandengan waktu baru yang ingin Anda tambahkan

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

1

Saat Anda membuat DateTimeobjek, gunakan konstruktor yang memungkinkan Anda menentukan waktu:

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

Jika Anda sudah memiliki DateTimeobjek dan ingin mengubah waktu, Anda dapat menambahkan menit, jam, atau detik ke Anda DateTimemenggunakan metode sederhana:

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

Perhatikan bagaimana kita harus "menyimpan" hasil dari setiap pemanggilan metode ke myDateTimevariabel. Ini karenaDateTime tidak dapat diubah, dan metodenya cukup membuat instance baru dengan tambahan jam / menit / detik.

Jika Anda perlu menambahkan jam dan menit (dan / atau detik) dan waktu yang sama, Anda dapat menyederhanakan kode dengan menambahkan kode TimeSpanasli 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

Jika Anda ingin menetapkan jam / minue / detik absolut, daripada menambahkan nilai yang ada, Anda dapat menggunakan DateTimekonstruktor yang disebutkan di atas , dan menggunakan kembali nilai untuk tahun / bulan / hari dari sebelumnya:

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

Tambahkan dan kurangi dengan menggunakan metode AddXXX
Chris Richner

1

Berikut adalah metode yang dapat Anda gunakan untuk melakukannya untuk Anda, gunakan seperti ini

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

Inilah metodenya, mungkin ada cara yang lebih baik, tapi saya baru saja membahasnya:

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

Saya baru saja menemukan posting ini karena saya memiliki masalah serupa di mana saya ingin mengatur waktu untuk objek Kerangka Entitas di MVC yang mendapatkan tanggal dari tampilan (datepicker) sehingga komponen waktu adalah 00:00:00 tetapi saya perlu itu menjadi waktu saat ini. Berdasarkan jawaban dalam posting ini saya datang dengan:

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

Anda dapat menetapkan nilai awal ke DateTimenilai baru dengan berbagai cara:

  • Metode Perpanjangan

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

lalu gunakan ChangeTime:

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.ChangeTime(12, 20, 10);
  • menggunakan metode Tambahkan

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

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.Date.Add(new TimeSpan(12, 20, 10));
  • menggunakan nilai awal

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

0

Apa yang salah dengan metode DateTime.AddSeconds di mana Anda dapat menambah atau mengurangi detik?


Bukan hanya itu, tetapi itu tidak terdengar seperti itu menjawab pertanyaan itu. Saya menduga OP menginginkan DateTime dengan tanggal yang sama tetapi waktu tertentu - yang akan relatif sulit dilakukan hanya dengan menggunakan AddSeconds.
Jon Skeet

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

Anda bisa menambahkan + ve / -ve nilai dalam parameter.

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

@ Jon: Saya berkomentar. pengguna perlu menetapkan nilai sebelum menggunakan kode ini.
Saar

@ Saar: Lebih penting lagi, Anda sekarang telah menambahkan tugas kembali ke s (kecuali untuk panggilan ke s. Tambahkan (...)).
Jon Skeet

@ Jon: Saya belajar pelajaran saya. Terima kasih atas kebaikan dan waktu Anda. Saya benar-benar serius.
Saar

0

Bukankah itu memperbaiki masalah Anda ??

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

0

Saya lebih memilih ini:

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;

        }

Gunakan seperti ini:

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

ini harus dikembalikan: 2016-06-06 00: 00: 00.000


-1

Solusi terbaik adalah:

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

1
Pada awalnya saya pikir ini salah, tetapi masuk akal jika Anda menetapkan hasilnya ke objek DateTime. Ini bukan solusi terbaik. Ini mengharuskan Anda untuk mengetahui bagian Waktu saat ini untuk membuat perhitungan yang benar, sambil mengambil bagian Tanggal dari tanggal dan menambahkan yang terbaik.
ThunderGr

1
Jelas bukan "terbaik". Jauh dari mudah dibaca dan dengan penggunaan berulang nomor ajaib.
BartoszKP

-1

Coba yang ini

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

-5

di sini adalah cara ghetto, tetapi ia bekerja :)

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

Cara ghetto lain tapi sedikit lebih bersih adalah bermain dengan detik. misalnya dt.AddSeconds(0-dt.Seconds).AddSeconds(newSecondsValue)tetapi tidak akan merekomendasikannya.
mike
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.