UtcNow tells you the date and time as it would be in Coordinated Universal Time, which is also called the Greenwich Mean Time time zone - basically like it would be if you were in London England, but not during the summer. DateTime. Now gives the date and time as it would appear to someone in your current locale.
DateTime. UtcNow is accurate to 15.625 milliseconds and stable over very long periods thanks to the time service updates.
datetime. utcnow() uses OS provided values. datetime. utcnow() uses gettimeofday(2) or time. time() on Python 2 (and gmtime(3) to convert the result into broken-down time).
The property UtcNow of the DateTime class returns the current date and time of the machine running the code, expressed in UTC format. UTC is a universal format to represent date and time as an alternative to local time. Also known as the GMT+00 timezone.
DateTime.UtcNow tells you the date and time as it would be in Coordinated Universal Time, which is also called the Greenwich Mean Time time zone - basically like it would be if you were in London England, but not during the summer. DateTime.Now gives the date and time as it would appear to someone in your current locale.
I'd recommend using DateTime.Now
whenever you're displaying a date to a human being - that way they're comfortable with the value they see - it's something that they can easily compare to what they see on their watch or clock. Use DateTime.UtcNow
when you want to store dates or use them for later calculations that way (in a client-server model) your calculations don't become confused by clients in different time zones from your server or from each other.
It's really quite simple, so I think it depends what your audience is and where they live.
If you don't use Utc, you must know the timezone of the person you're displaying dates and times to -- otherwise you will tell them something happened at 3 PM in system or server time, when it really happened at 5 PM where they happen to live.
We use DateTime.UtcNow
because we have a global web audience, and because I'd prefer not to nag every user to fill out a form indicating what timezone they live in.
We also display relative times (2 hours ago, 1 day ago, etc) until the post ages enough that the time is "the same" no matter where on Earth you live.
Also note the performance difference; DateTime.UtcNow
is somewhere around 30 times faster then DateTime.Now
, because internally DateTime.Now
is doing a lot of timezone adjustments (you can easily verify this with Reflector).
So do NOT use DateTime.Now
for relative time measurements.
One main concept to understand in .NET is that now is now all over the earth no matter what time zone you are in. So if you load a variable with DateTime.Now
or DateTime.UtcNow
-- the assignment is identical.* Your DateTime
object knows what timezone you are in and takes that into account regardless of the assignment.
The usefulness of DateTime.UtcNow
comes in handy when calculating dates across Daylight Savings Time boundaries. That is, in places that participate in daylight savings time, sometimes there are 25 hours from noon to noon the following day, and sometimes there are 23 hours between noon and noon the following day. If you want to correctly determine the number of hours from time A and time B, you need to first translate each to their UTC equivalents before calculating the TimeSpan
.
This is covered by a blog post i wrote that further explains TimeSpan
, and includes a link to an even more extensive MS article on the topic.
*Clarification: Either assignment will store the current time. If you were to load two variables one via DateTime.Now()
and the other via DateTime.UtcNow()
the TimeSpan
difference between the two would be milliseconds, not hours assuming you are in a timezone hours away from GMT. As noted below, printing out their String
values would display different strings.
This is a good question. I'm reviving it to give a little more detail on how .Net behaves with different Kind
values. As @Jan Zich points out, It's actually a critically important property and is set differently depending on whether you use Now
or UtcNow
.
Internally the date is stored as Ticks
which (contrary to @Carl Camera's answer) is different depending on if you use Now
or UtcNow
.
DateTime.UtcNow
behaves like other languages. It sets Ticks
to a GMT based value. It also sets Kind
to Utc
.
DateTime.Now
alters the Ticks
value to what it would be if it was your time of day in the GMT time zone. It also sets Kind
to Local
.
If you're 6 hours behind (GMT-6), you'll get the GMT time from 6 hours ago. .Net actually ignores Kind
and treats this time as if it was 6 hours ago, even though it's supposed to be "now". This breaks even more if you create a DateTime
instance then change your time zone and try to use it.
DateTime instances with different 'Kind' values are NOT compatible.
Let's look at some code...
DateTime utc = DateTime.UtcNow;
DateTime now = DateTime.Now;
Debug.Log (utc + " " + utc.Kind); // 05/20/2015 17:19:27 Utc
Debug.Log (now + " " + now.Kind); // 05/20/2015 10:19:27 Local
Debug.Log (utc.Ticks); // 635677391678617830
Debug.Log (now.Ticks); // 635677139678617840
now = now.AddHours(1);
TimeSpan diff = utc - now;
Debug.Log (diff); // 05:59:59.9999990
Debug.Log (utc < now); // false
Debug.Log (utc == now); // false
Debug.Log (utc > now); // true
Debug.Log (utc.ToUniversalTime() < now.ToUniversalTime()); // true
Debug.Log (utc.ToUniversalTime() == now.ToUniversalTime()); // false
Debug.Log (utc.ToUniversalTime() > now.ToUniversalTime()); // false
Debug.Log (utc.ToUniversalTime() - now.ToUniversalTime()); // -01:00:00.0000010
As you can see here, comparisons and math functions don't automatically convert to compatible times. The Timespan
should have been almost one hour, but instead was almost 6. "utc < now" should have been true (I even added an hour to be sure), but was still false.
You can also see the 'work around' which is to simply convert to universal time anywhere that Kind
is not the same.
My direct answer to the question agrees with the accepted answer's recommendation about when to use each one. You should always try to work with DateTime
objects that have Kind=Utc
, except during i/o (displaying and parsing). This means you should almost always be using DateTime.UtcNow
, except for the cases where you're creating the object just to display it, and discard it right away.
DateTime has no idea what time zones are. It always assumes you're at your local time. UtcNow only means "Subtract my timezone from the time".
If you want to use timezone-aware dates, use DateTimeOffset, which represents a date/time with a timezone. I had to learn that the hard way.
The "simple" answer to the question is:
DateTime.Now returns a DateTime value representing the current, system time (in whatever time zone the system is running in). The DateTime.Kind property will be DateTimeKind.Local
DateTime.UtcNow returns a DateTime value representing the current Universal Co-ordinated Time (aka UTC) which will be the same regardless of the system's time zone. The DateTime.Kind property will be DateTimeKind.Utc
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With