【问题标题】:C# - Get Date from Int ValueC# - 从 Int 值获取日期
【发布时间】:2019-05-01 20:38:28
【问题描述】:

早安,

我正在尝试检查令牌过期日期是否已过期。我正在使用 JWT 生成我的令牌。如果我的令牌仍然有效,我可以使用此代码检查我的 javascript 环境。

if (decodedToken.exp < new Date().getTime() / 1000) {
    alert("Session expired);
}

// decodedToken.exp returns a value like "1556797243"

但我的问题是,如果令牌已过期,我不知道如何使用 C# 代码进行验证。

我试过这样的,

// suppose I have a value of "1556797243"
var expirationDate = DateTime.ParseExact(expiration, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);

但它不起作用。

【问题讨论】:

    标签: c# datetime jwt-auth


    【解决方案1】:

    .NET 具有解析 Unix 时间戳的内置方法,但它在 DateTimeOffset 上,而不是在 DateTime 上,如您所料:

    var expirationTime = DateTimeOffset.FromUnixTimeSeconds(expiration).DateTime;
    

    如果过期是一个字符串,你需要先把它解析成一个长字符串:

    var expirationTime = DateTimeOffset.FromUnixTimeSeconds(long.Parse(expiration)).DateTime;
    

    【讨论】:

    • 但是不会有问题吧?我是否得到 datetimeoffset 而不是 datetime?
    • 最后一个.DateTime 部分将DateTimeOffset 转换为DateTime
    • 虽然使用.DateTime 不是完全错误,但最好使用.UtcDateTime,它将结果的.Kind 正确设置为DateTimeKind.Utc 而不是DateTimeKind.Unspecified
    【解决方案2】:

    您可以使用此函数将unixTime 转换为DateTime

    public static class DateUtil
        {
        private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    
        public static DateTime FromUnixTime(long unixTime)
        {
            return Epoch.AddMilliseconds(unixTime).ToLocalTime();
        }
    }
    
    var expirationDate  = DateUtil.FromUnixTime(yourtime);
    

    【讨论】:

    • 我找不到DateUtil
    • 我明白,但我的exp 是一个字符串。不长。所以我有一个错误
    • 你可以使用 var expirationDate = DateUtil.FromUnixTime(long.Parse(expiration));
    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多