1

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

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 在计算时间跨度时变成 {1/1/0001 12:00:00 AM}。

4

2 回答 2

2

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

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;
于 2012-06-23T07:00:06.043 回答
2

以下对我来说很好。由于您在 _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 不会加载 LoggedInTime,并且经过的时间计算不正确。要解决此问题,只需删除 Page_Load 中的 IsPostBack if 语句。确保每次加载页面时都设置实例变量 _loggedInTime,因此在回发时也是如此。

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

更多信息可以在 MSDN 上找到:

会话状态模式

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

于 2012-06-23T07:02:37.600 回答