回答:
以下は、ミリ秒未満のDateTimeで機能し、Kindプロパティ(Local、Utc、またはUndefined)も保持します。
DateTime dateTime = ... anything ...
dateTime = new DateTime(
dateTime.Ticks - (dateTime.Ticks % TimeSpan.TicksPerSecond),
dateTime.Kind
);
または同等でより短い:
dateTime = dateTime.AddTicks( - (dateTime.Ticks % TimeSpan.TicksPerSecond));
これは拡張メソッドに一般化できます:
public static DateTime Truncate(this DateTime dateTime, TimeSpan timeSpan)
{
if (timeSpan == TimeSpan.Zero) return dateTime; // Or could throw an ArgumentException
if (dateTime == DateTime.MinValue || dateTime == DateTime.MaxValue) return dateTime; // do not modify "guard" values
return dateTime.AddTicks(-(dateTime.Ticks % timeSpan.Ticks));
}
これは次のように使用されます。
dateTime = dateTime.Truncate(TimeSpan.FromMilliseconds(1)); // Truncate to whole ms
dateTime = dateTime.Truncate(TimeSpan.FromSeconds(1)); // Truncate to whole second
dateTime = dateTime.Truncate(TimeSpan.FromMinutes(1)); // Truncate to whole minute
...
var date = DateTime.Now;
date = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, date.Kind);
これは、以前の回答に基づいた拡張メソッドであり、任意の解像度に切り捨てることができます...
使用法:
DateTime myDateSansMilliseconds = myDate.Truncate(TimeSpan.TicksPerSecond);
DateTime myDateSansSeconds = myDate.Truncate(TimeSpan.TicksPerMinute)
クラス:
public static class DateTimeUtils
{
/// <summary>
/// <para>Truncates a DateTime to a specified resolution.</para>
/// <para>A convenient source for resolution is TimeSpan.TicksPerXXXX constants.</para>
/// </summary>
/// <param name="date">The DateTime object to truncate</param>
/// <param name="resolution">e.g. to round to nearest second, TimeSpan.TicksPerSecond</param>
/// <returns>Truncated DateTime</returns>
public static DateTime Truncate(this DateTime date, long resolution)
{
return new DateTime(date.Ticks - (date.Ticks % resolution), date.Kind);
}
}
DateTime d = DateTime.Now;
d = d.AddMilliseconds(-d.Millisecond);
Millisecond
プロパティは、0〜999の整数を指定します。したがって、操作前の時刻がであった場合、23:48:49.1234567
その整数は123
となり、操作後の時刻はになり23:48:49.0004567
ます。そのため、整数秒に切り捨てられていません。
年や月など、カレンダーに基づくものに切り捨てたい場合があります。以下は、任意の解像度を選択できる拡張メソッドです。
public enum DateTimeResolution
{
Year, Month, Day, Hour, Minute, Second, Millisecond, Tick
}
public static DateTime Truncate(this DateTime self, DateTimeResolution resolution = DateTimeResolution.Second)
{
switch (resolution)
{
case DateTimeResolution.Year:
return new DateTime(self.Year, 1, 1, 0, 0, 0, 0, self.Kind);
case DateTimeResolution.Month:
return new DateTime(self.Year, self.Month, 1, 0, 0, 0, self.Kind);
case DateTimeResolution.Day:
return new DateTime(self.Year, self.Month, self.Day, 0, 0, 0, self.Kind);
case DateTimeResolution.Hour:
return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerHour));
case DateTimeResolution.Minute:
return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerMinute));
case DateTimeResolution.Second:
return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerSecond));
case DateTimeResolution.Millisecond:
return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerMillisecond));
case DateTimeResolution.Tick:
return self.AddTicks(0);
default:
throw new ArgumentException("unrecognized resolution", "resolution");
}
}
ミリ秒を落として比較するのではなく、違いを比較してみませんか?
DateTime x; DateTime y;
bool areEqual = (x-y).TotalSeconds == 0;
または
TimeSpan precision = TimeSpan.FromSeconds(1);
bool areEqual = (x-y).Duration() < precision;
それほど明白ではありませんが、2倍以上高速です。
// 10000000 runs
DateTime d = DateTime.Now;
// 484,375ms
d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);
// 1296,875ms
d = d.AddMilliseconds(-d.Millisecond);
d.AddMilliseconds(-d.Millisecond)
、DateTimeを必ずしも前の1秒に正確に移動するわけではないことに注意してください。d.Ticks % TimeSpan.TicksPerMillisecond
秒を超えるティック(0から9,999の間)は残ります。
2番目に切り捨てるには:
dateTime.AddTicks(-dateTime.Ticks % TimeSpan.TicksPerSecond)
に置き換えてTicksPerMinute
、分に切り捨てます。
コードがパフォーマンスに敏感な場合は、注意してください
new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second)
私のアプリはCPU時間の12%を費やしていました System.DateTime.GetDatePart。
読みやすい方法は...
//Remove milliseconds
DateTime date = DateTime.Now;
date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss", null);
もっと...
//Remove seconds
DateTime date = DateTime.Now;
date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm"), "yyyy-MM-dd HH:mm", null);
//Remove minutes
DateTime date = DateTime.Now;
date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH"), "yyyy-MM-dd HH", null);
//and go on...
var now = DateTime.Parse(DateTime.Now.ToString())
機能するため、実際よりも簡単な場合があります。
Diadistisの反応について。乗算の前に除算の小数部分を削除するためにFloorを使用する必要があったことを除いて、これは私にとってはうまくいきました。そう、
d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);
なる
d = new DateTime(Math.Floor(d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);
2つのLong値を除算するとLongになるため、小数部分が削除されると予想していましたが、乗算後に正確に同じ値を残してDoubleとして解決されました。
Eppsy
2上記のソリューションの拡張方法
public static bool LiesAfterIgnoringMilliseconds(this DateTime theDate, DateTime compareDate, DateTimeKind kind)
{
DateTime thisDate = new DateTime(theDate.Year, theDate.Month, theDate.Day, theDate.Hour, theDate.Minute, theDate.Second, kind);
compareDate = new DateTime(compareDate.Year, compareDate.Month, compareDate.Day, compareDate.Hour, compareDate.Minute, compareDate.Second, kind);
return thisDate > compareDate;
}
public static bool LiesAfterOrEqualsIgnoringMilliseconds(this DateTime theDate, DateTime compareDate, DateTimeKind kind)
{
DateTime thisDate = new DateTime(theDate.Year, theDate.Month, theDate.Day, theDate.Hour, theDate.Minute, theDate.Second, kind);
compareDate = new DateTime(compareDate.Year, compareDate.Month, compareDate.Day, compareDate.Hour, compareDate.Minute, compareDate.Second, kind);
return thisDate >= compareDate;
}
使用法:
bool liesAfter = myObject.DateProperty.LiesAfterOrEqualsIgnoringMilliseconds(startDateTime, DateTimeKind.Utc);
最速のソリューションではありませんが、シンプルで理解しやすい:
DateTime d = DateTime.Now;
d = d.Date.AddHours(d.Hour).AddMinutes(d.Minute).AddSeconds(d.Second)
DateID.Text = DateTime.Today.ToShortDateString();
Use ToShortDateString() //Date 2-02-2016
Use ToShortDateString() // Time
そしての使用によって
ToLongDateString() // its show 19 February 2016.
:P
string
代わりにを生成するように要求していると誤って解釈された可能性があることがわかりますDateTime
が、これにより出力から時間コンポーネントが完全に省略されます。(これにより、Today
プロパティへのアクセスも不要になります。)
新しい方法
String Date = DateTime.Today.ToString("dd-MMM-yyyy");
//文字列パスパラメータdd-mmm-yyyyを定義し、2016年2月24日を返す
またはテキストボックスに表示されます
txtDate.Text = DateTime.Today.ToString("dd-MMM-yyyy");
// PageonLoadを置く
string
代わりにを生成するように要求していると誤って解釈された可能性があることがわかりますDateTime
が、これにより出力から時間コンポーネントが完全に省略されます。(これにより、Today
プロパティへのアクセスも不要になります。)
私の場合、秒とミリ秒を保存せずにdatetimePickerツールからTimeSpanを保存することを目指していましたが、これが解決策です。
最初に、datetimePicker.valueを目的の形式(「HH:mm」)に変換してから、TimeSpanに変換します。
var datetime = datetimepicker1.Value.ToString("HH:mm");
TimeSpan timeSpan = Convert.ToDateTime(datetime).TimeOfDay;
string
)は、次のようになります。DateTime datetime = datetimepicker1.Value; TimeSpan timeSpan = new TimeSpan(datetime.Hour, datetime.Minute, 0);
または、値を操作して秒を切り捨てるJoeの拡張メソッドのバリエーションを使用できます。TimeSpan
TimeSpan timeSpan = datetime.TimeOfDay.Truncate(TimeSpan.FromSeconds(1));
これは、ここと同様の質問に投稿された拡張メソッドの私のバージョンです。これにより、ティック値が読みやすく検証され、元のDateTimeインスタンスのDateTimeKindが保持されます。(MongoDBのようなデータベースに保存する場合、これには微妙ですが関連する副作用があります。)
真の目的が指定された値(つまり、時間/分/秒/ MS)にDateTimeを切り捨てることである場合、代わりにこの拡張メソッドをコードに実装することをお勧めします。これにより、有効な精度にのみ切り捨てることができ、元のインスタンスの重要なDateTimeKindメタデータが保持されます。
public static DateTime Truncate(this DateTime dateTime, long ticks)
{
bool isValid = ticks == TimeSpan.TicksPerDay
|| ticks == TimeSpan.TicksPerHour
|| ticks == TimeSpan.TicksPerMinute
|| ticks == TimeSpan.TicksPerSecond
|| ticks == TimeSpan.TicksPerMillisecond;
// /programming/21704604/have-datetime-now-return-to-the-nearest-second
return isValid
? DateTime.SpecifyKind(
new DateTime(
dateTime.Ticks - (dateTime.Ticks % ticks)
),
dateTime.Kind
)
: throw new ArgumentException("Invalid ticks value given. Only TimeSpan tick values are allowed.");
}
次に、次のような方法を使用できます。
DateTime dateTime = DateTime.UtcNow.Truncate(TimeSpan.TicksPerMillisecond);
dateTime.Kind => DateTimeKind.Utc
string
の表現はDateTime
、おそらく編集は、それが「切り捨て」にすることを明確にする必要があります/「ドロップ」ミリ秒の手段「が生じるDateTime
すべての日付/時刻コンポーネントは除いて同じである値TimeOfDay.TotalMilliseconds
です0
。」もちろん、人々は読むことはしませんが、あいまいさをなくすためだけに読みます。