【问题标题】:reverse timestamp反向时间戳
【发布时间】:2012-05-25 05:21:27
【问题描述】:

我试图用时间戳将一些东西保存到日志表中,所以我首先这样做:

public static string TimeStamp(
   this DateTime datetime, string timestamptFormat = "yyyyMMddHHmmssffff")
   {
     return datetime.ToString(timestamptFormat);
   }

然后我发现了一个像这样的sn-p:

static public string ToReverseTimestamp(this DateTime dateTime)
{
return string.Format("{0:10}", DateTime.MaxValue.Ticks - dateTime.Ticks);
}

我开始想知道反向时间戳到底有什么用,然后遇到了this article

现在我的问题是:第二个 sn-p 是否正确?以及如何将其转换回“正常”时间戳,或者如何从中获取可读的日期时间信息?

【问题讨论】:

  • "{0:10}" 的格式不好。我建议只做"{0}"
  • @Joel 我需要一个解释,先生! :)
  • 当然。当我使用"{0:10}" 运行代码时,我得到了前面带有 1 的 long 值。当我检查标准数字格式字符串时,“10”不是其中之一。那个 1 在我的long.Parse 中引起了我的OverflowException。转到"{0}" 解决了问题。
  • 是的..我也遇到了那个异常...谢谢

标签: c# timestamp


【解决方案1】:

确保在转换之前将DateTime 转换为世界时以避免时区问题:

public static string ToReverseTimestamp(this DateTime dateTime)
{
    return (long.MaxValue - dateTime.ToUniversalTime().Ticks).ToString();
}

您可以通过将string 解析为long、计算MaxValue - (MaxValue - x) = x 并使用DateTimeKind.UtcDateTimeKind.Utc 构造一个新的DateTime 来将值转换回DateTime

public static DateTime FromReverseTimestamp(string timestamp)
{
    return new DateTime(long.MaxValue - long.Parse(timestamp), DateTimeKind.Utc);
}

例子:

var input = DateTime.Now;                      // {17/05/2012 16:03:17} (Local)
var timestamp = ToReverseTimestamp(input);     // "2520650302020786038"
var result = FromReverseTimestamp(timestamp);  // {17/05/2012 18:03:17} (Utc)

【讨论】:

  • 有趣。反向时间戳的目的是什么?
  • 但是你为什么要做 toUTC,你不应该对第一个 DateTime 也应用同样的吗?
  • @Agzam:没关系,只要在FromReverseTimestamp中使用相同的值即可。
  • 不,我的意思是,不应该是这样的:DateTime.MaxValue.ToUniversalTime().Ticks - dateTime.ToUniversalTime().Ticks
  • @jp2code - 按照原始问题中的链接。给出了反向时间戳的目的的一个很好的例子。
猜你喜欢
  • 1970-01-01
  • 2012-01-18
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多