0

我想知道在哪里捕获日期信息的最佳实践/模式/意见是什么。

那会在表示层中并作为事务元数据的一部分发送到服务器吗?还是在服务器上创建的?

我的应用程序要求用户在一个国家/地区创建“交易”。其他人应该能够看到在另一个国家/地区创建交易的当地时间。

目前我正在业务逻辑层中捕获日期。如果我在数据访问层中捕获它,我想我会得到同样的错误结果。

另一种说法是更好的:

服务器端

[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;
}
4

2 回答 2

4

首先,帮自己一个忙,并DateTime在服务器端以 UTC 或“祖鲁时间”处理。到达客户端后处理任何转换。

// on the server side
var serverNow = DateTime.UtcNow;
Console.WriteLine(serverNow);

// and on the client side
var myLocalNow = serverNow.ToLocalTime();
Console.WriteLine(myLocalNow);

一般来说,您对“现在几点了?”的最终裁决者。应该是服务器——这是你最直接控制的世界。从客户端的角度看到的任何时间都应该从服务器从高处传递的“真正的时间”转换而来。

'当然,这只是我的观点,在处理本地->服务器时间转换时被多次烧毁,略有影响。(啊)

于 2013-03-19T20:48:33.167 回答
1

如果您需要在客户端本地时间跟踪事件,您真的别无选择,只能在客户端捕获。对于 .NET(我猜您正在使用它,因为您的示例代码看起来像 C#),DateTimeOffset为此提供了一种比使用 DateTime 和单独跟踪的时区信息更方便的机制。

不幸的是,如果客户端和服务器系统时间之间存在差异,则在客户端捕获时间戳会引入服务器端处理的潜在问题(包括潜在的安全问题)。解决这个问题的简单方法是将客户端捕获的时间与当前服务器时间进行比较,如果它超出某个容差差距(例如:服务器时间任一方向上的 5 分钟),则拒绝它。即使它通过了这个测试,你也不应该直接存储客户端捕获的时间戳。相反,您应该使用转换为客户端时区的服务器当前时间。

于 2013-03-21T17:56:07.157 回答