2
// http://code.google.com/p/servicestack/wiki/TypeSerializer
3
// ServiceStack.Text: .NET C# POCO Type Text Serializer.
6
// Demis Bellot (demis.bellot@gmail.com)
8
// Copyright 2011 Liquidbit Ltd.
10
// Licensed under the same terms of ServiceStack: new BSD license.
14
using ServiceStack.Text.Common;
16
namespace ServiceStack.Text
19
/// A fast, standards-based, serialization-issue free DateTime serailizer.
21
public static class DateTimeExtensions
23
public const long UnixEpoch = 621355968000000000L;
24
private static readonly DateTime UnixEpochDateTimeUtc = new DateTime(UnixEpoch, DateTimeKind.Utc);
25
private static readonly DateTime UnixEpochDateTimeUnspecified = new DateTime(UnixEpoch, DateTimeKind.Unspecified);
27
public static long ToUnixTime(this DateTime dateTime)
29
return (dateTime.ToStableUniversalTime().Ticks - UnixEpoch) / TimeSpan.TicksPerSecond;
32
public static DateTime FromUnixTime(this double unixTime)
34
return UnixEpochDateTimeUtc + TimeSpan.FromSeconds(unixTime);
37
public static long ToUnixTimeMs(this DateTime dateTime)
39
return (dateTime.ToStableUniversalTime().Ticks - UnixEpoch) / TimeSpan.TicksPerMillisecond;
42
public static DateTime FromUnixTimeMs(this double msSince1970)
44
return UnixEpochDateTimeUtc + TimeSpan.FromMilliseconds(msSince1970);
47
public static DateTime FromUnixTimeMs(this long msSince1970)
49
return UnixEpochDateTimeUtc + TimeSpan.FromMilliseconds(msSince1970);
52
public static DateTime FromUnixTimeMs(this long msSince1970, TimeSpan offset)
54
return UnixEpochDateTimeUnspecified + TimeSpan.FromMilliseconds(msSince1970) + offset;
57
public static DateTime FromUnixTimeMs(this double msSince1970, TimeSpan offset)
59
return UnixEpochDateTimeUnspecified + TimeSpan.FromMilliseconds(msSince1970) + offset;
62
public static DateTime FromUnixTimeMs(string msSince1970)
65
if (long.TryParse(msSince1970, out ms)) return ms.FromUnixTimeMs();
67
// Do we really need to support fractional unix time ms time strings??
68
return double.Parse(msSince1970).FromUnixTimeMs();
71
public static DateTime FromUnixTimeMs(string msSince1970, TimeSpan offset)
74
if (long.TryParse(msSince1970, out ms)) return ms.FromUnixTimeMs(offset);
76
// Do we really need to support fractional unix time ms time strings??
77
return double.Parse(msSince1970).FromUnixTimeMs(offset);
80
public static DateTime RoundToMs(this DateTime dateTime)
82
return new DateTime((dateTime.Ticks / TimeSpan.TicksPerMillisecond) * TimeSpan.TicksPerMillisecond);
85
public static DateTime RoundToSecond(this DateTime dateTime)
87
return new DateTime((dateTime.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);
90
public static string ToShortestXsdDateTimeString(this DateTime dateTime)
92
return DateTimeSerializer.ToShortestXsdDateTimeString(dateTime);
95
public static DateTime FromShortestXsdDateTimeString(this string xsdDateTime)
97
return DateTimeSerializer.ParseShortestXsdDateTime(xsdDateTime);
100
public static bool IsEqualToTheSecond(this DateTime dateTime, DateTime otherDateTime)
102
return dateTime.ToStableUniversalTime().RoundToSecond().Equals(otherDateTime.ToStableUniversalTime().RoundToSecond());
105
public static string ToTimeOffsetString(this TimeSpan offset, bool includeColon = false)
107
var sign = offset < TimeSpan.Zero ? "-" : "+";
108
var hours = Math.Abs(offset.Hours);
109
var minutes = Math.Abs(offset.Minutes);
110
var separator = includeColon ? ":" : "";
111
return string.Format("{0}{1:00}{2}{3:00}", sign, hours, separator, minutes);
114
public static TimeSpan FromTimeOffsetString(this string offsetString)
116
if (!offsetString.Contains(":"))
117
offsetString = offsetString.Insert(offsetString.Length - 2, ":");
119
offsetString = offsetString.TrimStart('+');
121
return TimeSpan.Parse(offsetString);
124
public static DateTime ToStableUniversalTime(this DateTime dateTime)
127
// Silverlight 3, 4 and 5 all work ok with DateTime.ToUniversalTime, but have no TimeZoneInfo.ConverTimeToUtc implementation.
128
return dateTime.ToUniversalTime();
130
// .Net 2.0 - 3.5 has an issue with DateTime.ToUniversalTime, but works ok with TimeZoneInfo.ConvertTimeToUtc.
131
// .Net 4.0+ does this under the hood anyway.
132
return TimeZoneInfo.ConvertTimeToUtc(dateTime);
b'\\ No newline at end of file'