回答:
DateTime値は変更できません-不変です。ただし、変数を変更して新しい値にすることができます。時刻のみを変更する最も簡単な方法は、関連する時刻でTimeSpanを作成し、DateTime.Dateプロパティを使用することです。
DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;
s
これで同じ日付になりますが、午前10時30分です。
DateTime
両方向の「ナイーブ」なグレゴリオ時間を表す夏時間の遷移は無視されることに注意してください(DateTime
ドキュメントの「解説」セクションを参照)。唯一の例外は.Now
and .Today
です。これらのイベントは、発生時にこれらのイベントを反映する現在のシステム時刻を取得します。
これが、野田タイムのプロジェクトを始めるきっかけになりました。現在、制作準備が整っています。そのZonedDateTime
タイプは、tz
データベースエントリにリンクすることによって「認識」されます。
Add
ゼロのタイムスパンを提供する必要があるのですか?あなたの表現はと同等ですがs.Date
、それよりも長い...
DateTime
S、(時間の日付と1対1に)あなたはこれを行うことができます:var result = date.Date + time.TimeOfDay;
time
ませんDateTime
。(もちろん私は野田タイムを使いますが...)
さて、私は私の提案、拡張メソッドで飛び込んでいます:
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);
Datetime.Today.Add(time.TimeOfDay)
です。これは、内部では、日付部分のうるう年の計算を除いて、コンストラクターがカレンダーベースの修正を行わないためです。つまりDateTime
、Pythonのdatetime
モジュールに関しては「素朴な」実装です。
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);
このようにして、新しい時間、分、秒の部分を好みに応じて挿入しながら、日付を保存します。
.AddMilliseconds()
、必要に応じて実行することもできます。
時間を別の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
変数のプロパティを使用するので、日付だけを取得し、期間を追加します。
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);
2014/02/05 18:19:51のようなDateTimeがあり、2014/02/05だけが必要な場合は、次のようにできます。
_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)
日付に.Dateを追加すると、真夜中(00:00)に設定されます。
MyDate.Date
注同等のSQLはCONVERT(DATETIME, CONVERT(DATE, @MyDate))
この方法の優れた点は、入力が速く、読みやすいことです。おまけは、文字列からの変換がないことです。
つまり、今日の日付を23:30に設定するには、次を使用します。
DateTime.Now.Date.AddHours(23).AddMinutes(30)
もちろん、DateTime.NowまたはMyDateを任意の日付に置き換えることができます。
実際、一度作成された時間は変更できません。しかし、多くのコンストラクタで簡単に作成できます。 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);
を使用してDate.Add
、追加するNew TimeSpan
新しい時間でを追加します
DateTime dt = DateTime.Now
dt.Date.Add(new TimeSpan(12,15,00))
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
、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
これはあなたのためにあなたがそれを行うために使用できる方法です、このようにそれを使用してください
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
);
}
//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();
初期値を新しい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);
秒を加算または減算できるDateTime.AddSecondsメソッドの何が問題になっていますか?
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));
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
最善の解決策は:
currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);
ここはゲットーの方法ですが、動作します:)
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)
、それをお勧めしません。