检查 DateTime 变量是否分配了值

在 C # 中是否有一种简单的方法来检查 DateTime 实例是否已经分配了值?

311775 次浏览

有一个变量没有在 C # 中被赋值的唯一方法是让它成为一个局部变量——在这种情况下,在编译时你可以通过尝试读取它来判断它是否被赋值:)

我怀疑你真的想要 Nullable<DateTime>(或者带有 C # 语法糖的 DateTime?)-让它从 null开始,然后分配一个正常的 DateTime值(这将被适当地转换)。然后您可以与 null(或使用 HasValue属性)进行比较,看看是否设置了“ real”值。

如果可能,使用 Nullable<DateTime>

DateTime 是值类型,因此它永远不能为空。 如果你认为日期时间? (可空) ,你可以使用:

DateTime? something = GetDateTime();
bool isNull = (something == null);
bool isNull2 = !something.HasValue;

你是这个意思吗:

DateTime datetime = new DateTime();


if (datetime == DateTime.MinValue)
{
//unassigned
}

或者你可以使用 Nullable

DateTime? datetime = null;


if (!datetime.HasValue)
{
//unassigned
}

在可能的情况下,我通常倾向于使用值类型的默认值来确定它们是否已经设置。这显然不可能始终如一,特别是对于 int 类型——但是对于 DateTimes 来说,我认为保留 MinValue 来表示它没有被更改已经足够公平了。相对于 nullables,这样做的好处是少了一个可以获得 null 引用异常的地方(可能还有很多地方在访问它之前不需要检查 null!)

我刚刚发现未分配日期时间的 GetHashCode ()总是零。我不确定这是否是检查 null datetime 的好方法,因为我找不到任何文档说明为什么会显示这种行为。

if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}

我会说默认值总是 new DateTime()。所以我们可以写

DateTime datetime;


if (datetime == new DateTime())
{
//unassigned
}

把这个放在某个地方:

public static class DateTimeUtil //or whatever name
{
public static bool IsEmpty(this DateTime dateTime)
{
return dateTime == default(DateTime);
}
}

然后:

DateTime datetime = ...;


if (datetime.IsEmpty())
{
//unassigned
}

如果你不想担心 Null 值的问题,比如每次使用它时都要检查 Null 值,或者在某些逻辑中包装它,而且你也不想担心偏移时间的问题,那么这就是我解决这个问题的方法:

startDate = startDate <= DateTime.MinValue.AddSeconds(1) ? keepIt : resetIt

我只是检查默认值是不到一天后的时间开始。非常有效。

编辑2021: 如果你需要检查时间开始的毫秒,那么只需要加上滴答声,但也许碳年代测定法才是你真正想要的。仍然不能确定碳年代测定法是否会像你需要的那样准确,如果你需要对蜱虫进行精确测定的话。

编辑2022:

Https://learn.microsoft.com/en-us/archive/msdn-magazine/2016/august/data-points-ef-core-change-tracking-behavior-unchanged-modified-and-added

IsKeySet: Added
The EntityEntry object, which holds the tracking information for each entity, has a new property called IsKeySet. IsKeySet is a great addition to the API. It checks to see if the key property in the entity has a value. This eliminates the guessing game (and related code) to see if an object already has a value in its key property (or properties if you have a composed key). IsKeySet checks to see if the value is the default value of the particular type you specified for the key property. So if it’s an int, is it 0? If it’s a Guid, is it equal to Guid.Empty (00000000-0000-0000-0000-000000000000)? If the value is not the default for the type, IsKeySet returns true.


If you know that in your system you can unequivocally differentiate a new object from a pre-existing object by the value of its key property, then IsKeySet is a really handy property for determining the state of entities.

创建属性为 DateTime 可空的类

public class MyClass
{
public DateTime? DateExample { get; set; }
}

在你的编程逻辑中使用:

DateTime? dateExample = null;
if (!dateExample.HasValue)
{
Console.WriteLine("Is Null"); // Is Null
}


dateExample = DateTime.Now;
if (dateExample.HasValue)
{
Console.WriteLine("Is Not Null"); // Is Not Null
}

新的 DateTime 的默认值是时间的开头“1/1/000112:00:00 AM”,如果没有分配任何内容,则该值不为空。如果您将该值检查为那个值,那么它就没有被赋值。