0

我们的数据库服务器在国外。所以我使用TimeZoneInfo存储了创建的日期,如下所示,

DateTime dateTime = DateTime.Now;
        var timeZone = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dateTime, TimeZoneInfo.Local.Id, "India Standard Time");

在页面中,我显示Timespan 已使用。我为此创建了单独的类..

我的代码

 public static string GetFriendlyDate(DateTime dateTime)
    {
        TimeSpan ts = DateTime.Now.Subtract(dateTime);

        string friendlyDate = dateTime.ToShortDateString();
        int totalDays = (int)System.Math.Round(ts.TotalDays);
        int totalHours = (int)System.Math.Round(ts.TotalHours);
        int totalMinutes = (int)System.Math.Round(ts.TotalMinutes);
        int totalSeconds = (int)System.Math.Round(ts.TotalSeconds);
        int totalMilliSeconds = (int)System.Math.Round(ts.TotalMilliseconds);

        int totalMonths = totalDays / 31;  //approx.. change this
        int totalYears = totalDays / 365; //approx.. change this

        if (totalYears > 0) //give in terms of years
        {
            if (totalYears == 1)
                friendlyDate = "last year";
            else
                friendlyDate = totalYears + " years ago";
        }
        else if (totalMonths > 1) //give in terms of months
        {
            if (totalMonths == 1)
                friendlyDate = "last month";
            else
                friendlyDate = totalMonths + " months ago";
        }
        else if (totalDays > 1) //give in terms of days (at least 2 days)
        {
            friendlyDate = totalDays + " days ago";
        }
        else if (totalHours > 0) //give in terms of hours
        {
            if (totalHours == 1)
                friendlyDate = "1 hour ago";
            else
                friendlyDate = totalHours + " hours ago";
        }
        else if (totalMinutes > 0) // give in terms of minutes
        {
            if (totalMinutes == 1)
                friendlyDate = "1 minute ago";
            else
                friendlyDate = totalMinutes + " minutes ago";
        }
        else if (totalSeconds > 0) //give in terms of seconds
        {
            if (totalSeconds == 1)
                friendlyDate = "1 second ago";
            else
                friendlyDate = totalSeconds + " seconds ago";
        }
        else //just now
        {
            friendlyDate = "a moment ago";
        }

        return friendlyDate;
    }

当我在本地运行时,它正确显示“--seconds ago”......就像那样..但在服务器中它总是显示在片刻之前,几个小时后它需要“---hours ago”这样......

谁能帮我解决这个问题?

4

2 回答 2

0

如果我想以正确的方式问我的问题,我必须将时间转换为 UTC。

所以我改变了..

var utcTime = DateTime.UtcNow.AddHours(5).AddMinutes(30);
        TimeSpan ts = utcTime.Subtract(dateTime);

现在问题解决了……

于 2013-10-03T08:17:13.893 回答
0

您按照印度标准时间存储项目,然后将它们与当地时间进行比较。

您在回答中给出的解决方案是将时间调整回印度标准时间,该时间固定在+5:30与 UTC 的偏移量。这仅适用于 IST 没有任何夏令时规则。如果您使用不同的时区,例如美国东部时间,它将无法可靠地工作。

正确的解决方案是将原始值存储为 UTC。无需使用DateTime.Now并转换为 IST,只需DateTime.UtcNow直接使用并存储该值。当你在你的GetFriendlyDate方法中进行比较时,你也应该DateTime.UtcNow以此作为比较的基础。

如果您已经在印度标准时间的数据库中保存了数据,那么您需要在进行此更改时更新这些值。例如,如果这是 SQL Server,您可以运行以下脚本将您的值从 IST 更新为 UTC:

UPDATE mytable SET thedatetime = DATEADD(minute, -330, thedatetime)

通常,本地日期/时间值(例如从中检索的那些DateTime.Now)在 Web 应用程序中没有任何业务。阅读反对 DateTime.Now 的案例

于 2013-10-07T03:01:58.410 回答