问题
I don't know why this is so complicated!
I have a plugin that is passing in a long int UTC. I need to convert that number into a DateTime
to query my database (SQL Server).
I don't know why, but I can't find a workable answer from a basic google search.
(For extra credit, I need to turn my returned DateTime
back into a UTC at the end of the day.)
This is embarrassing to have to ask such a basic question! :)
回答1:
My guess is it's going to be either milliseconds or seconds since a particular epoch - quite possibly the Unix epoch of January 1st 1970, midnight UTC.
So the code would look something like:
private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0,
DateTimeKind.Utc);
public static DateTime FromMillisecondsSinceUnixEpoch(long milliseconds)
{
return UnixEpoch.AddMilliseconds(milliseconds);
}
Make the obvious changes for seconds, or from a different epoch :)
An alternative approach is to create a TimeSpan
of the seconds/milliseconds since the epoch, and then add it to the epoch:
private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0,
DateTimeKind.Utc);
public static DateTime FromMillisecondsSinceUnixEpoch(long milliseconds)
{
return UnixEpoch + TimeSpan.FromMilliseconds(milliseconds);
}
I don't know of any significant difference between them - although the fact that AddMilliseconds
takes a double
instead of a long
suggests that for very large values, the TimeSpan
approach may be preferable. I doubt that it'll make any difference though :)
回答2:
Is the int you get seconds, milliseconds, or what? After converting it to ticks, (one .NET tick is 100 nanoseconds) e.g. by long ticks = theDBDateNum*TimeSpan.TicksPerMillisecond;
, try this:
DateTime theDate = new DateTime(ticks, DateTimeKind.Utc);
回答3:
According to https://www.epochconverter.com/,
The Unix epoch (or Unix time or POSIX time or Unix timestamp) is the number of seconds that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap seconds.
And later,
var epoch = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
Later still,
private string epoch2string(int epoch) { return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(epoch).ToShortDateString(); }
来源:https://stackoverflow.com/questions/6565023/c-sharp-convert-utc-int-to-datetime-object