답변:
다음은 소수 밀리 초가있는 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을 이전의 초 단위로 정확하게 이동할 필요는 없습니다. d.Ticks % TimeSpan.TicksPerMillisecond
두 번째 이상으로 진드기 (0에서 9,999 사이)가 남아 있습니다.
두 번째로 반올림하려면 다음을 수행하십시오.
dateTime.AddTicks(-dateTime.Ticks % TimeSpan.TicksPerSecond)
로 교체 TicksPerMinute
하여 분으로 내립니다.
코드가 성능에 민감한 경우주의하십시오
new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second)
내 앱은 System.DateTime.GetDatePart 에서 CPU 시간의 12 %를 소비했습니다 .
쉽게 읽을 수있는 방법은 ...
//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);
두 Long 값을 나누면 Long이 발생하여 소수 부분을 제거 할 것으로 예상했지만 곱셈 후에 정확히 같은 값을 남기는 Double로 해석합니다.
간질
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.
:피
string
대신 DateTime
에을 대신해 생산하는 것을 어떻게 잘못 해석했는지 알 수 있지만, 이것은 출력에서 시간 성분을 완전히 생략한다 . ( Today
그것도 재산에 대한 접근을 불필요하게 만듭니다 .)
새로운 방법
String Date = DateTime.Today.ToString("dd-MMM-yyyy");
// 문자열 패스 매개 변수 dd-mmm-yyyy를 반환합니다.
또는 텍스트 상자에 표시
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와 같은 데이터베이스에 저장할 때 미묘하지만 관련 부작용이 있습니다.)
진정한 목표가 DateTime을 지정된 값 (예 : Hours / Minutes / Seconds / MS)으로 자르는 것이라면 코드에서이 확장 방법을 구현하는 것이 좋습니다. 유효한 정밀도로만자를 수 있으며 원본 인스턴스의 중요한 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
." 사람들은 물론 읽지 않고 모호성을 제거하기 위해서입니다.