我们的数据库服务器位于国外。所以我使用 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;
}
当我运行本地时,它正确地显示“ - 秒前”......就像那样..但是在服务器中它总是显示在片刻之后,几个小时之后它就像那样“ - 小时前”。
任何人都可以帮我解决这个问题吗?
答案 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。