You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

DateTimeUtils.cs 2.2 KiB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using System;
  2. namespace Discord
  3. {
  4. //Source: https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/DateTimeOffset.cs
  5. internal static class DateTimeUtils
  6. {
  7. #if !NETSTANDARD1_3
  8. private const long UnixEpochTicks = 621_355_968_000_000_000;
  9. private const long UnixEpochSeconds = 62_135_596_800;
  10. private const long UnixEpochMilliseconds = 62_135_596_800_000;
  11. #endif
  12. public static DateTimeOffset FromSnowflake(ulong value)
  13. => FromUnixMilliseconds((long)((value >> 22) + 1420070400000UL));
  14. public static ulong ToSnowflake(DateTimeOffset value)
  15. => ((ulong)ToUnixMilliseconds(value) - 1420070400000UL) << 22;
  16. public static DateTimeOffset FromTicks(long ticks)
  17. => new DateTimeOffset(ticks, TimeSpan.Zero);
  18. public static DateTimeOffset? FromTicks(long? ticks)
  19. => ticks != null ? new DateTimeOffset(ticks.Value, TimeSpan.Zero) : (DateTimeOffset?)null;
  20. public static DateTimeOffset FromUnixSeconds(long seconds)
  21. {
  22. #if NETSTANDARD1_3
  23. return DateTimeOffset.FromUnixTimeSeconds(seconds);
  24. #else
  25. long ticks = seconds * TimeSpan.TicksPerSecond + UnixEpochTicks;
  26. return new DateTimeOffset(ticks, TimeSpan.Zero);
  27. #endif
  28. }
  29. public static DateTimeOffset FromUnixMilliseconds(long milliseconds)
  30. {
  31. #if NETSTANDARD1_3
  32. return DateTimeOffset.FromUnixTimeMilliseconds(milliseconds);
  33. #else
  34. long ticks = milliseconds * TimeSpan.TicksPerMillisecond + UnixEpochTicks;
  35. return new DateTimeOffset(ticks, TimeSpan.Zero);
  36. #endif
  37. }
  38. public static long ToUnixSeconds(DateTimeOffset dto)
  39. {
  40. #if NETSTANDARD1_3
  41. return dto.ToUnixTimeSeconds();
  42. #else
  43. long seconds = dto.UtcDateTime.Ticks / TimeSpan.TicksPerSecond;
  44. return seconds - UnixEpochSeconds;
  45. #endif
  46. }
  47. public static long ToUnixMilliseconds(DateTimeOffset dto)
  48. {
  49. #if NETSTANDARD1_3
  50. return dto.ToUnixTimeMilliseconds();
  51. #else
  52. long milliseconds = dto.UtcDateTime.Ticks / TimeSpan.TicksPerMillisecond;
  53. return milliseconds - UnixEpochMilliseconds;
  54. #endif
  55. }
  56. }
  57. }