// 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 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;
+ }
}
}