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ドキュメントの「解説」セクションを参照)。唯一の例外は.Nowand .Todayです。これらのイベントは、発生時にこれらのイベントを反映する現在のシステム時刻を取得します。

これが、野田タイムのプロジェクトを始めるきっかけになりました。現在、制作準備が整っています。そのZonedDateTimeタイプはtzデータベースエントリにリンクすることによって「認識」されます


11
s.Date.Add(new TimeSpan(0、0、0))も機能するはずです。日をチェックするときに時間をゼロにするためにそれを使用します。
ヨーグルトザワイズ

8
@ user295734:なぜAddゼロのタイムスパンを提供する必要があるのですか?あなたの表現はと同等ですがs.Date、それよりも長い...
Jon Skeet

それを修正するのを忘れて、コードを配置した後で、ゼロに設定するためにそれを実現しました(私が最初に検索していたもの)。しかし、私はちょうど0に設定していない場合は、1行に時間設定を取得する方法を示してしようとしていた
ヨーグルトザ・ワイズを

3
あなたは2つの持っている場合はDateTimeS、(時間の日付と1対1に)あなたはこれを行うことができます:var result = date.Date + time.TimeOfDay;
ザカリーイエーツ

2
@ZacharyYates:はい、その時点でモデルが壊れていると私は主張しますが、であってはなりtimeませんDateTime。(もちろん私は野田タイムを使いますが...)
Jon Skeet 2013

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、Pythonのdatetimeモジュールに関しては「素朴な」実装です。
ivan_pozdeev 2014年

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

このようにして、新しい時間、分、秒の部分を好みに応じて挿入しながら、日付を保存します。


@Webleeuwもちろん、追加された値によっては、ArgumentOutOfRangeExceptionがリモートで発生する可能性があります。これを示すPexパズルを次に示します。
2013年

ユースケースによっては.AddMilliseconds()、必要に応じて実行することもできます。
Broots Waymb

40

一発ギャグ

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

今日の日付を4:30:00の時間で戻し、DateTime.Nowを任意の日付オブジェクトに置き換えます


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方法。そしてDatedateToUse変数のプロパティを使用するので、日付だけを取得し、期間を追加します。


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のようなDateTimeがあり、2014/02/05だけが必要な場合は、次のようにできます。

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

3

日付に.Dateを追加すると、真夜中(00:00)に設定されます。

MyDate.Date

同等のSQLはCONVERT(DATETIME, CONVERT(DATE, @MyDate))

この方法の優れた点は、入力が速く、読みやすいことです。おまけは、文字列からの変換がないことです。

つまり、今日の日付を23:30に設定するには、次を使用します。

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

もちろん、DateTime.NowまたはMyDateを任意の日付に置き換えることができます。



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が不変であり、そのメソッドが追加の時間/分/秒を追加して新しいインスタンスを作成するだけだからです。

時間と分(および/または秒)の両方と同じ時間を追加する必要がある場合はTimeSpanDateTime代わりにを元のに追加することでコードを簡略化できます。

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メソッドを使用して足し算と引き算
Chris Richner、2009

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

ビューから日付を取得するMVCのEntity Frameworkオブジェクト(datepicker)の時間を設定して時間コンポーネントを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);
  • タイムスパンを使用する

    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メソッドの何が問題になっていますか?


それだけでなく、とにかく質問に答えるようには思えません。OPは同じ日付で特定の時間のDateTime を必要としていると思います。これはAddSecondsを使用するだけでは比較的困難です。
Jon Skeet、

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

@ジョン:私はその行にコメントした。ユーザーはこのコードを使用する前に値を割り当てる必要があります。
ザール

@Saarは:さらに重要なことは、あなたがきになりました(s.Add(...)への呼び出しを除く)バックsの割り当てを追加しました。
Jon Skeet、

@ジョン:私は自分のレッスンを学びました。親切と時間をありがとう。私は本当にそれを意味します。
ザール


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 2013

1
間違いなく「最高」ではない。可読性とは程遠く、マジックナンバーを繰り返し使用します。
BartoszKP 2015年

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

もう1つのゲットーの方法ですが、少しだけきれいにすると、秒で遊ぶだけになります。例えばdt.AddSeconds(0-dt.Seconds).AddSeconds(newSecondsValue)、それをお勧めしません。
マイク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.