에서 밀리초 단위로 잘라내는 방법.NET 날짜 시간
수신 요청의 타임스탬프를 데이터베이스에 저장된 값과 비교하려고 합니다.물론 SQL Server는 시간 및 에 읽을 때 몇 밀리초의 정밀도를 유지합니다.NET DateTime(NET DateTime). 여기에는 해당 밀리초가 포함됩니다.그러나 시스템에 대한 수신 요청은 그러한 정밀도를 제공하지 않기 때문에 밀리초 단위만 삭제하면 됩니다.
뭔가 분명한 것을 놓치고 있는 것 같은 느낌이 들지만 우아한 방법을 찾지 못했습니다(C#).
다음은 분수 밀리초를 가지며 Kind 속성(Local, Utc 또는 Unfined)을 보존하는 DateTime에 대해 작동합니다.
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);
경우에 따라 달력 기반(예: 연도 또는 월)으로 자르기를 원할 수 있습니다.원하는 해상도를 선택할 수 있는 확장 방법이 있습니다.
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;
두 번째로 반올림하기
dateTime.AddTicks(-dateTime.Ticks % TimeSpan.TicksPerSecond)
대체TicksPerMinute분 단위로 반올림합니다.
코드가 성능에 민감한 경우 주의:
new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second)
내 앱은 시스템에서 CPU 시간의 12%를 사용했습니다.날짜 시간.날짜 부품 가져오기.
덜 분명하지만 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);
가장 빠른 솔루션은 아니지만 간단하고 이해하기 쉽습니다.
DateTime d = DateTime.Now;
d = d.Date.AddHours(d.Hour).AddMinutes(d.Minute).AddSeconds(d.Second)
쉽게 읽을 수 있는 방법은...
//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...
이해하기 쉽다는 것은 이해하지만, 성능이 부족합니다.
Diadistis 대응과 관련하여.곱셈 전에 분할 부분을 제거하기 위해 바닥을 사용해야 한다는 점을 제외하고는 이것이 저에게 효과적이었습니다.그렇게,
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 인스턴스의 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;
// https://stackoverflow.com/questions/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
DateID.Text = DateTime.Today.ToShortDateString();
Use ToShortDateString() //Date 2-02-2016
Use ToShortDateString() // Time
및 사용자
ToLongDateString() // its show 19 February 2016.
:P
새 방법
String Date = DateTime.Today.ToString("dd-MMM-yyyy");
string pass 매개 변수 dd-mmm-yyyy 반환 24-2016년 2월
또는 텍스트 상자에 표시됨
txtDate.Text = DateTime.Today.ToString("dd-MMM-yyyy");
적재 시 페이지로 이동
저의 경우 초와 밀리초를 절약하지 않고 datetimePicker 도구에서 TimeSpan을 절약하는 것을 목표로 했는데, 여기 해결책이 있습니다.
먼저 datetimePicker.value를 원하는 형식으로 변환합니다. 내 형식은 "HH:mm"를 선택한 후 TimeSpan으로 다시 변환합니다.
var datetime = datetimepicker1.Value.ToString("HH:mm");
TimeSpan timeSpan = Convert.ToDateTime(datetime).TimeOfDay;
분할을 사용하면 됩니다.
new TimeSpan(new DateTime(1970, 1, 1).Ticks).TotalSeconds.ToString().Split('.')[0]
답이 꽤 늦었다는 것은 알지만, 밀리초를 없애는 가장 좋은 방법은
var currentDateTime = DateTime.Now.ToString("s");
변수 값을 인쇄해 보십시오. 날짜 시간이 밀리초 단위로 표시됩니다.
언급URL : https://stackoverflow.com/questions/1004698/how-to-truncate-milliseconds-off-of-a-net-datetime
'programing' 카테고리의 다른 글
| 프로그램이 복구를 시도하지 않아야 하는 예외는 무엇입니까? (0) | 2023.05.12 |
|---|---|
| MongoDB - 집계를 사용하여 배열 해제 및 중복 제거 (0) | 2023.05.07 |
| ngFor(Angular 9) 내부의 동적 템플릿 참조 변수 (0) | 2023.05.07 |
| AsNet Web API 2.1 클라이언트 IP 주소 가져오기 (0) | 2023.05.07 |
| ASP에서 Excel 파일을 생성하는 중입니다.그물 (0) | 2023.05.07 |