I\'ve been wondering what exactly are the principles of how the two properties work. I know the second one is universal and basically doesn\'t deal with time zones, but can
A little bit late to the party, but I found these two links (4guysfromrolla) to be very useful:
Using Coordinated Universal Time (UTC) to Store Date/Time Values
Advice for Storing and Displaying Dates and Times Across Different Time Zones
DateTime.UtcNow is a continuous, single-valued time scale, whereas DateTime.Now is not continuous or single-valued. The primary reason is Daylight Savings Time, which doesn't apply to UTC. So UTC never jumps forward or back an hour, whereas local time(DateTime.Now) does. And when it jumps backward, the same time value occurs twice.
DateTime.UtcNow is a Universal time scale omitting Daylight Savings Time. So UTC never changes due to DST.
But, DateTime.Now is not continuous or single-valued because it changes according to DST. Which means DateTime.Now, the same time value may occur twice leaving customers in a confused state.
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.
Just a little addition to the points made above: the DateTime struct also contains a little known field called Kind (at least, I did not know about it for a long time). It is basically just a flag indicating whether the time is local or UTC; it does not specify the real offset from UTC for local times. Besides the fact that it indicates with what intentions the stuct was constructed, it also influences the way how the methods ToUniversalTime() and ToLocalTime() work.
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.