OSDN Git Service

pbs.twimg.com の画像URLのフォーマット変更に対応
[opentween/open-tween.git] / OpenTween / DateTimeUtc.cs
index e5a1149..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,6 +78,9 @@ namespace OpenTween
             this.datetime = datetime;
         }
 
+        public long UtcTicks
+            => this.datetime.Ticks;
+
         public long ToUnixTime()
             => (long)((this - UnixEpoch).TotalSeconds);
 
@@ -135,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;
+        }
     }
 }