OSDN Git Service

pbs.twimg.com の画像URLのフォーマット変更に対応
[opentween/open-tween.git] / OpenTween / DateTimeUtc.cs
index 47a6452..ffcac36 100644 (file)
 // 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));
@@ -62,6 +65,11 @@ namespace OpenTween
         {
         }
 
+        public DateTimeUtc(long utcTicks)
+            : this(new DateTime(utcTicks, DateTimeKind.Utc))
+        {
+        }
+
         public DateTimeUtc(DateTime datetime)
         {
             if (datetime.Kind != DateTimeKind.Utc)
@@ -70,12 +78,18 @@ namespace OpenTween
             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;
 
@@ -91,6 +105,18 @@ namespace OpenTween
         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);
 
@@ -120,5 +146,32 @@ namespace OpenTween
 
         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;
+        }
     }
 }