使用 c# 从会话检索日期时间并在 ASP.Net 中计算时间跨度时出现问题



我将日期时间存储在会话中,如下所述:-

Session["LoggedInTime"] = System.DateTime.Now;

然后我在这样的页面加载中检索此值:-

DateTime _loggedInTime = Convert.ToDateTime(Session["LoggedInTime"]);

我调试了上面的代码,发现到目前为止,_loggedInTIme显示的是我存储在其中的正确日期。之后,我像这样计算时间跨度:-

TimeSpan elapsedtimespan = System.DateTime.Now.Subtract(_loggedInTime);
int elapsedtime = Convert.ToInt32(elapsedtimespan.TotalSeconds);

我在调试代码时发现,在减去_loggedInTime = {1/1/0001 12:00:00 AM} 时,因此我无法获得确切的经过时间。

请帮助我解决此问题,因为我不明白为什么_loggedInTime在计算 TimeSpan 时变为 {1/1/0001 12:00:00 AM}。

以下内容对我来说很好用。由于您在_loggedInTime前面加上下划线,因此我假设您将其声明为页面本身的实例变量。

private DateTime _loggedInTime;
protected void Page_Load(object sender, EventArgs e)
{
    if (Session["LoggedInTime"] == null)
        Session["LoggedInTime"] = DateTime.Now;
    _loggedInTime = Convert.ToDateTime(Session["LoggedInTime"]);
    TimeSpan elapsedtimespan = DateTime.Now.Subtract(_loggedInTime);
    int elapsedtime = Convert.ToInt32(elapsedtimespan.TotalSeconds);
}

我猜您是在另一个时间计算经过的时间,而不是像上面示例中那样在Page_Load中计算。

在计算经过的时间之前,请确保在每次回发时正确加载会话的已用时间。在下一次回发时,_loggedInTime将重置为 DateTime 的默认值,即 {1/1/0001 12:00:00 AM}。

我认为您对以下设置有一些东西。

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        if (Session["LoggedInTime"] == null)
            Session["LoggedInTime"] = DateTime.Now;
        _loggedInTime = Convert.ToDateTime(Session["LoggedInTime"]);
    }
}
private void ButtonClick(object sender, ImageClickEventArgs e)
{
    TimeSpan elapsedtimespan = DateTime.Now.Subtract(_loggedInTime);
    int elapsedtime = Convert.ToInt32(elapsedtimespan.TotalSeconds);
}

在这里,我通过在单击按钮时处理回发来演示它。在这种情况下,Page_Load不会加载登录时间,并且已用时间计算不正确。要解决此问题,只需删除Page_Load中的 IsPostBack if 语句。请确保在每次加载页面时设置实例变量_loggedInTime,因此也在回发时设置实例变量。

备注:还要检查您是否在服务器场上。如果您使用多个服务器来处理您的请求,但配置了错误的会话模式(例如,在进程中),则服务器 A 会将会话变量存储在其内存中,但重定向可以由服务器 B 处理,它不知道服务器 A 的内存中会话存储。

有关详细信息,请参阅MSDN:

会话状态模式

进程中会话状态是默认设置,在服务器场方案中,可以使用 StateServer 或 SqlServer 替代项在服务器之间共享会话状态。或者,您可以编写自己的自定义会话状态提供程序。

由于这是 DateTime 的默认值,我猜您正在尝试使用 loggedInTime,而它之前未在会话对象中初始化。 换句话说,我的建议是尝试以下方法:

int elapsedtime = 0;
if (Session["LoggedInTime"] != null)
{
    DateTime _loggedInTime = (DateTime)Session["LoggedInTime"];
    TimeSpan elapsedtimespan = System.DateTime.Now.Subtract(_loggedInTime);
    elapsedtime = Convert.ToInt32(elapsedtimespan.TotalSeconds);
}
else Session["LoggedInTime"] = System.DateTime.Now;

最新更新