我想知道在哪里捕获日期信息的最佳实践/模式/意见。
是否会在表示层中作为事务元数据的一部分发送到服务器?或者在服务器上创建?
我的应用程序要求用户在一个国家/地区创建“交易”。其他人应该能够看到在另一个国家/地区创建交易的当地时间。
目前我正在业务逻辑层中捕获日期。如果我在数据访问层中捕获它,我想我会得到同样的结果。
[WebMethod()]
public TransactionItem SaveTransaction(int ID)
{
TransactionItem transaction = new TransactionItem();
transaction.ID = ID;
transaction.TimeRequest = DateTime.Now; //<-- thinking this is my problem.
new TransactionDAL().SaveTransaction(transaction);
return transaction;
}
[WebMethod()]
public TransactionItem SaveTransaction(int ID, DateTime TimeRequest)
{
TransactionItem transaction = new TransactionItem();
transaction.ID = ID;
transaction.TimeRequest = TimeRequest; // <-- this might be better?
new TransactionDAL().SaveTransaction(transaction);
return transaction;
}
答案 0 :(得分:4)
首先,帮自己一个忙,并在服务器端专门处理UTC中的DateTime
或“Zulu时间”。一旦你到达客户端,就处理任何转换。
// on the server side
var serverNow = DateTime.UtcNow;
Console.WriteLine(serverNow);
// and on the client side
var myLocalNow = serverNow.ToLocalTime();
Console.WriteLine(myLocalNow);
一般来说,你的最后仲裁者是“几点了?”应该是服务器 - 这是你最直接控制的世界。从客户端的角度看,任何时候都应该从服务器从高处传递的“The One True Time”进行转换。
'当然,这只是我的观点,稍微受到因处理Local-&gt;服务器时间转换而多次被烧毁的影响。 (啊)
答案 1 :(得分:1)
如果您需要在客户端的本地时间跟踪事件,您真的别无选择,只能在客户端捕获它。对于.NET(我猜你正在使用,因为你的示例代码看起来像C#),DateTimeOffset提供了一个比使用DateTime和单独跟踪的时区信息更方便的机制。
不幸的是,如果客户端和服务器系统时间之间存在差异,则捕获客户端上的时间戳会引发服务器端处理(包括潜在的安全问题)的潜在问题。解决这个问题的简单方法是将客户端捕获的时间与当前服务器时间进行比较,如果超出某个容差范围(例如:服务器时间的任一方向为5分钟),则将其拒绝。即使它通过了此测试,也不应直接存储客户端捕获的时间戳。相反,您应该将服务器当前时间转换为客户端的时区。