【发布时间】:2020-09-06 07:49:47
【问题描述】:
我在一个类中有这个静态方法:
public class MyTimeZoneHelperClass {
public static TimeZoneInfo EST = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
public static DateTime Convert_UTC_to_EST(this DateTime utcDateTime)
{
return TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, EST);
}
public static DateTime NowEST()
{
return DateTime.UtcNow.Convert_UTC_to_EST();
}
}
我刚刚为 DateTime TYPE 编写了一个扩展方法,我将其命名为“EstNow”,因此我可以使用 DateTime.EstNow,就像这段代码使用 DateTime.UtcNow 一样。如果我有这个,我就不必引用上面的这个静态类 - MyTimeZoneHelperClass.NowEst - 我的代码会更干净一点,我不必记住那个类名/我更喜欢这里的一个类而不是两个.
所以扩展方法不能那样工作。它们是静态方法,但是你需要一个类的实例来调用该方法 - 呵呵!
这可能吗?我可以(最好是轻松地)让编译器识别类型上的新/自定义静态方法吗?
【问题讨论】:
-
顺便说一句,我强烈建议您将您的领域(最好是在使其成为属性之后)称为
EasternTime而不是EST。尽管有时区 ID,它 不是 EST - 它是东部时间,在 EST 和 EDT 之间变化。 (无论如何,这可能是您想要的,但我强烈建议您避免使用“EST”作为“东部时间”的同义词,因为它们不是同一个东西。)我还鼓励您遵循 .NET 命名约定(没有下划线,并使用Utc而不是UTC等)。 -
根据我的经验,我在下一个项目中再也不会直接使用 DateTime 了。我经常读到有人建议这样做,我开始了解它的好处。我会制作一个接口和一个自己的实现,将 DateTime 与所需的所有功能封装起来。您可以将其转换为 DateTime 用于您的旧代码。这会以某种方式解决你的问题,不是吗?但尤其是对于单元测试,这似乎非常有用(例如,通过模拟一个假的当前时间)。
-
说起来老兄。我必须打破所有这些工作规则,我应该养成这个习惯。所以说出来......但这是个人的,也许是一次性的,我只是想尽可能快地写这个东西。 :)
-
告诉 Reno,我确实需要当前的日期时间来进行单元测试。谢谢。主要是好奇。但是,是的,对于我的迫切需要,DateTime.EstNow 会很方便。
标签: c# timezone extension-methods static-methods