// the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
// Boston, MA 02110-1301, USA.
+#nullable enable
+
using System;
+using System.Globalization;
namespace OpenTween
{
/// <summary>
/// <see cref="DateTimeKind.Utc"/> に固定された <see cref="DateTime"/> を扱うための構造体
/// </summary>
- public struct DateTimeUtc : IComparable<DateTimeUtc>, IEquatable<DateTimeUtc>
+ public readonly struct DateTimeUtc : IComparable<DateTimeUtc>, IEquatable<DateTimeUtc>
{
public static DateTimeUtc MinValue { get; }
= new DateTimeUtc(DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc));
{
}
+ public DateTimeUtc(long utcTicks)
+ : this(new DateTime(utcTicks, DateTimeKind.Utc))
+ {
+ }
+
public DateTimeUtc(DateTime datetime)
{
if (datetime.Kind != DateTimeKind.Utc)
this.datetime = datetime;
}
+ public long UtcTicks
+ => this.datetime.Ticks;
+
public long ToUnixTime()
=> (long)((this - UnixEpoch).TotalSeconds);
public DateTimeOffset ToDateTimeOffset()
=> new DateTimeOffset(this.datetime);
+ public DateTimeOffset ToLocalTime()
+ => this.ToDateTimeOffset().ToLocalTime();
+
public DateTime ToDateTimeUnsafe()
=> this.datetime;
public override int GetHashCode()
=> this.datetime.GetHashCode();
+ public override string ToString()
+ => this.ToString("G");
+
+ public string ToString(string format)
+ => this.ToDateTimeOffset().ToString(format);
+
+ public string ToLocalTimeString()
+ => this.ToLocalTimeString("G");
+
+ public string ToLocalTimeString(string format)
+ => this.ToLocalTime().ToString(format);
+
public static DateTimeUtc operator +(DateTimeUtc a, TimeSpan b)
=> new DateTimeUtc(a.datetime + b);
public static DateTimeUtc FromUnixTime(long unixTime)
=> UnixEpoch + TimeSpan.FromTicks(unixTime * TimeSpan.TicksPerSecond);
+
+ public static DateTimeUtc Parse(string input, IFormatProvider formatProvider)
+ => new DateTimeUtc(DateTimeOffset.Parse(input, formatProvider, DateTimeStyles.AssumeUniversal));
+
+ public static bool TryParse(string input, IFormatProvider formatProvider, out DateTimeUtc result)
+ {
+ if (DateTimeOffset.TryParse(input, formatProvider, DateTimeStyles.AssumeUniversal, out var datetimeOffset))
+ {
+ result = new DateTimeUtc(datetimeOffset);
+ return true;
+ }
+
+ result = MinValue;
+ return false;
+ }
+
+ public static bool TryParseExact(string input, string[] formats, IFormatProvider formatProvider, out DateTimeUtc result)
+ {
+ if (DateTimeOffset.TryParseExact(input, formats, formatProvider, DateTimeStyles.AssumeUniversal, out var datetimeOffset))
+ {
+ result = new DateTimeUtc(datetimeOffset);
+ return true;
+ }
+
+ result = MinValue;
+ return false;
+ }
}
}