Am'm încercarea de a compara o ștampilă de timp de la o cerere de intrare la o bază de date stocate valoare. SQL Server desigur păstrează unele de precizie de milisecunde, în timp, și atunci când a citit într-o .NET DateTime, include acele milisecunde. Cererea de intrare în sistem, cu toate acestea, nu oferă precizie, așa că am nevoie să renunțe pur și simplu la milisecunde.
Mă simt ca și cum am'm lipsește ceva evident, dar nu am't a găsit un mod elegant de a nu-l (C#).
Următoarele va lucra pentru o DateTime care are fracționată milisecunde, și păstrează, de asemenea, un Fel de proprietate (Locale, Utc sau Nedefinit).
DateTime dateTime = ... anything ...
dateTime = new DateTime(
dateTime.Ticks - (dateTime.Ticks % TimeSpan.TicksPerSecond),
dateTime.Kind
);
sau echivalent și mai scurt:
dateTime = dateTime.AddTicks( - (dateTime.Ticks % TimeSpan.TicksPerSecond));
Acest lucru ar putea fi generalizate într-o metodă de prelungire:
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));
}
care este folosit după cum urmează:
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
...
Aici este o extensie metoda bazată pe un precedent răspuns care vă va permite să trunchiați la orice rezolutie...
Utilizare:
DateTime myDateSansMilliseconds = myDate.Truncate(TimeSpan.TicksPerSecond);
DateTime myDateSansSeconds = myDate.Truncate(TimeSpan.TicksPerMinute)
Clasa:
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);
}
}
În loc de cădere milisecunde apoi compară, de ce nu compara diferența?
DateTime x; DateTime y;
bool areEqual = (x-y).TotalSeconds == 0;
sau
TimeSpan precision = TimeSpan.FromSeconds(1);
bool areEqual = (x-y).Duration() < precision;
Uneori, pe care doriți să o trunchiați la ceva bazate pe calendar, ca an sau o lună. Aici's o metodă de prelungire care vă permite să alegeți orice rezoluție.
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");
}
}
Mai puțin evident, dar mai mult de 2 ori mai repede :
// 10000000 runs
DateTime d = DateTime.Now;
// 484,375ms
d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);
// 1296,875ms
d = d.AddMilliseconds(-d.Millisecond);
Pentru a rotunji la cel de-al doilea:
dateTime.AddTicks(-dateTime.Ticks % TimeSpan.TicksPerSecond)
Înlocuiți cu TicksPerMinute` a rotunji până la minut.
În cazul în care codul este performanta sensibil, să fie precaut cu privire la
new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second)
Aplicația mea a fost cheltuieli 12% din CPU în timp System.DateTime.GetDatePart.
O cale pentru o citire ușoară este...
//Remove milliseconds
DateTime date = DateTime.Now;
date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss", null);
Și mai mult...
//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...
2 metode de Extensie pentru soluțiile menționate mai sus
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;
}
utilizare:
bool liesAfter = myObject.DateProperty.LiesAfterOrEqualsIgnoringMilliseconds(startDateTime, DateTimeKind.Utc);
Cu privire Diadistis răspuns. Aceasta a lucrat pentru mine, cu excepția faptului că a trebuit să folosesc Podea pentru a elimina partea fracționară a diviziei înainte de multiplicare. Deci,
d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);
devine
d = new DateTime(Math.Floor(d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);
M-aș fi așteptat divizia de două valori a rezultat într-un Timp, eliminând astfel partea zecimală, dar se rezolvă ca un Dublu lăsând exact aceeași valoare după multiplicare.
Eppsy
Noua Metoda
String Date = DateTime.Today.ToString("dd-MMM-yyyy");
// definim Șirul trece parametru dd-mmm-yyyy reveni 24-feb-2016
Sau afișat pe caseta
txtDate.Text = DateTime.Today.ToString("dd-MMM-yyyy");
// pune pe PageonLoad
DateID.Text = DateTime.Today.ToShortDateString();
Use ToShortDateString() //Date 2-02-2016
Use ToShortDateString() // Time
Și De Utilizare A
ToLongDateString() // its show 19 February 2016.
:P
În cazul meu, am fost cu scopul de a salva Durata de timp de la datetimePicker instrument fără a salva câteva secunde și milisecunde, și aici este soluția.
Prima converti datetimePicker.valoarea la formatul dorit, care este a mea "HH:mm" apoi converti înapoi la Durata de timp.
var datetime = datetimepicker1.Value.ToString("HH:mm");
TimeSpan timeSpan = Convert.ToDateTime(datetime).TimeOfDay;
Știu că răspunsul este destul de târziu, dar cel mai bun mod de a scapa de milisecunde este
var currentDateTime = DateTime.Now.ToString("s");
Încercați să imprimați valoarea variabilei, se va afișa în data de timp, fără milisecunde.