更改为当地时间后显示时间跨度值

时间:2013-10-01 07:02:14

标签: c# datetime timespan

我们的数据库服务器位于国外。所以我使用 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;
    }

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

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

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

所以我改变了......

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

现在问题已经解决......

答案 1 :(得分:0)

您在印度标准时间存储物品,然后将它们与当地时间进行比较。

您在答案中提供的解决方案是将时间调整回印度标准时间,该时间固定为距离UTC +5:30偏移。这仅适用,因为IST没有任何夏令时规则。如果您使用的是其他时区,例如美国东部时间,则无法可靠地运行。

正确的解决方案是将原始值存储为UTC。不要使用DateTime.Now并转换为IST,只需使用DateTime.UtcNow并直接存储值即可。当您使用GetFriendlyDate方法进行比较时,还应使用DateTime.UtcNow作为比较基础。

如果您已在India Standard Time中将数据保存在数据库中,则需要在进行此更改时更新这些值。例如,如果这是SQL Server,则可以运行以下脚本将值从IST更新为UTC:

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

通常,本地日期/时间值(例如从DateTime.Now检索到的值)在Web应用程序中没有业务。阅读The Case Against DateTime.Now