// OpenTween - Client of Twitter
// Copyright (c) 2018 kim_upsilon (@kim_upsilon)
// All rights reserved.
//
// This file is part of OpenTween.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 3 of the License, or (at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program. If not, see , or write to
// the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
// Boston, MA 02110-1301, USA.
using System;
using System.Globalization;
namespace OpenTween
{
///
/// に固定された を扱うための構造体
///
public struct DateTimeUtc : IComparable, IEquatable
{
public static DateTimeUtc MinValue { get; }
= new DateTimeUtc(DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc));
public static DateTimeUtc MaxValue { get; }
= new DateTimeUtc(DateTime.SpecifyKind(DateTime.MaxValue, DateTimeKind.Utc));
public static DateTimeUtc UnixEpoch { get; }
= new DateTimeUtc(1970, 1, 1, 0, 0, 0);
public static DateTimeUtc Now
=> new DateTimeUtc(DateTime.UtcNow);
private readonly DateTime datetime;
public DateTimeUtc(int year, int month, int day)
: this(year, month, day, hour: 0, minute: 0, second: 0)
{
}
public DateTimeUtc(int year, int month, int day, int hour, int minute, int second)
: this(year, month, day, hour, minute, second, millisecond: 0)
{
}
public DateTimeUtc(int year, int month, int day, int hour, int minute, int second, int millisecond)
: this(new DateTime(year, month, day, hour, minute, second, millisecond, DateTimeKind.Utc))
{
}
public DateTimeUtc(DateTimeOffset datetimeOffset)
: this(datetimeOffset.UtcDateTime)
{
}
public DateTimeUtc(DateTime datetime)
{
if (datetime.Kind != DateTimeKind.Utc)
throw new ArgumentException("datetime には UTC に変換された時刻が必須です", nameof(datetime));
this.datetime = datetime;
}
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 int CompareTo(DateTimeUtc other)
=> this.datetime.CompareTo(other.datetime);
public bool Equals(DateTimeUtc other)
=> this == other;
public override bool Equals(object obj)
=> obj is DateTimeUtc other && this.Equals(other);
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 operator -(DateTimeUtc a, TimeSpan b)
=> new DateTimeUtc(a.datetime - b);
public static TimeSpan operator -(DateTimeUtc a, DateTimeUtc b)
=> a.datetime - b.datetime;
public static bool operator ==(DateTimeUtc a, DateTimeUtc b)
=> a.datetime == b.datetime;
public static bool operator !=(DateTimeUtc a, DateTimeUtc b)
=> a.datetime != b.datetime;
public static bool operator <(DateTimeUtc a, DateTimeUtc b)
=> a.datetime < b.datetime;
public static bool operator <=(DateTimeUtc a, DateTimeUtc b)
=> a.datetime <= b.datetime;
public static bool operator >(DateTimeUtc a, DateTimeUtc b)
=> a.datetime > b.datetime;
public static bool operator >=(DateTimeUtc a, DateTimeUtc b)
=> a.datetime >= b.datetime;
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;
}
}
}