How to Format a Nullable Datetime with Tostring()

How can I format a nullable DateTime with ToString()?

Console.WriteLine(dt2 != null ? dt2.Value.ToString("yyyy-MM-dd hh:mm:ss") : "n/a"); 

EDIT: As stated in other comments, check that there is a non-null value.

Update: as recommended in the comments, extension method:

public static string ToString(this DateTime? dt, string format)
=> dt == null ? "n/a" : ((DateTime)dt).ToString(format);

And starting in C# 6, you can use the null-conditional operator to simplify the code even more. The expression below will return null if the DateTime? is null.

dt2?.ToString("yyyy-MM-dd hh:mm:ss")

Nullable DateTime to String

try this one,

 string strdatetime = datetime.HasValue ? datetime.Value.ToString("MM/dd/yyyy") : string.Empty;

Nullable DateTime to String

try this one,

 string strdatetime = datetime.HasValue ? datetime.Value.ToString("MM/dd/yyyy") : string.Empty;

C# NullableDateTime to string

string date = myVariable.HasValue ? myVariable.Value.ToString() : string.Empty;

How to format DateTime in case of Nullable?

You can use null-conditional Operators (available since C# 6.0).

string s = BirthDate?.ToString("dd/MM/yyyy");

This returns null if BirthDate has no value (is null), i.e. ToString will not be called in this case. If you want to return a text in this case instead, you can use the null-coalescing operator

string s = BirthDate?.ToString("dd/MM/yyyy") ?? "none";

or you can use the ternary conditional operator (works with older C# versions)

string s = BirthDate.HasValue ? BirthDate.Value.ToString("dd/MM/yyyy") : "none";

or with the newer pattern matching (C# 7.0)

string s = BirthDate is DateTime d ? d.ToString("dd/MM/yyyy") : "none";

In Razor, apply this in parentheses (the ? seems to confuse Razor):

<li><b>BirthDate</b> : @(Model.BirthDate?.ToString("dd/MM/yyyy"))</li> 

or

<li>
<b>BirthDate</b> : @(BirthDate.HasValue ? BirthDate.Value.ToString("dd/MM/yyyy") : "")
</li>

C# get nullable datetime ToString format method with params to set Expression.Call

I would recommend building an expression like;

Expression<Func<T?, string>> expr = d => d.HasValue ? d.Value.ToString("...") : null;

For example;

        private static Dictionary<Type,string> Formats = ...

private Expression ToString(Expression value)
{
if (value.Type.IsGenericType && value.Type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
return Expression.Condition(
Expression.Property(value, "HasValue"),
ToString(Expression.Property(value, "Value")),
Expression.Constant(null, typeof(string))
);
}
var toString = value.Type.GetMethod("ToString", new Type[] { typeof(string) });
return Expression.Call(value, toString, Expression.Constant(Formats[value.Type]));
}

How to convert a nullable datetime value to string.empty when datetime is null?

You're calling the IT_Date.Value.ToString(...) regardless of whether IT_Date actually has a value.

So you need to turn the expression around:

r.IT_Date.HasValue ? r.IT_Date.Value.ToString(...) : ""

This way ToString() will only be called when IT_Date has a value.

You can also implement this in the getter, as mentioned in a now-deleted comment:

public string IT_Date_String 
{
get
{
return IT_Date.HasValue ? IT_Date.Value.ToString(...) : "";
}
}

This way you won't have to reimplement the logic everywhere you access this model, and as a bonus, it will only be executed when it's actually requested.

There's also no need to explicitly use String.Empty, the string "" will be interned to the same at runtime.

Formatting a nullable DateTime field in MVC

The problem here is that the DateTime? has no ToString() method which accepts formatting string. To overcome this, you can use the following piece of code:

@string.Format("{0:ddd dd mmm yyyy}", item.DailyReportDate)

If DailyReportDate is null, then this code will render as an empty string. Otherwise, you get your formatted datetime. This behavior is described in Nullable.ToString Method documentation

Hope that helps.


Not exactly what you want, but this can help you.

If you had a simple DateTime (non-nullable), then here is a good example on how to accomplish what you want. To summarize, all you need to do is to set a DisplayFormatAttribute attribute on your property

public class Model {
[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}")]
public DateTime? DailyReportDate { get; set;}
}

and then you can use it like pointed out:

@Html.DisplayFor(item=> item.DailyReportDate)

You can find the documentation for DisplayFormatAttribute here

Format nullable DateTime in C#

Nullable<T> is the generic wrapper that wraps the T type

It has 2 properties: Value and HasValue. Value is the value of the wrapped object and HasValue is a boolean that indicates if there is a value to obtain in the Value property. If HasValue is true, then Value will not be the default(usually null or empty struct). If HasValue is false, then Value will be default.

So to access the DateTime's ToString method you need to call DueDate.Value.ToString

would be

var dueDate = siteRow.DueDate.HasValue ? siteRow.DueDate.Value.ToString(cultureInfo.DateTimeFormat.ShortDatePattern) : null

or using the abbreviated syntax

var dueDate = siteRow.DueDate?.ToString(cultureInfo.DateTimeFormat.ShortDatePattern);

Entity Framework: nullable DateTime toString(format) in vb.net handling

If you do a small experiment, you would understand perfectly what is happening:

Dim normalDate As Date = Now
Dim nullableDate As Nullable(Of Date) = normalDate

Dim normalToText As String = normalDate.ToString("dd/MM/yy") 'Works perfectly

Dim nullableToText As String = nullableDate.ToString("dd/MM/yy") 'Error

The content in both variables, normalDate and nullableDate, is identical but they are not: the ToString("date in certain format") functionality expects a Date type as input; what you are sending is a modified version of the Date type (not too different, but not the same either). With CDate what you are doing is converting the modified version of Date into an actually valid Date type and thus the ToString() functionality works without any problem.

Are you doing the right thing? Yes, as far as CDate can deal with "nulls" (CDate(Nothing) does not output any error): you are adapting the given variable to what ToString() expects.

NOTE: I have checked the exact error output by the code above and it effectively delivers a "Conversion from string "dd/MM/yy" to type 'Integer' is not valid.". Thus the error you are getting is the standard error when intending to use ToString("date") with a Nullable Date; not too descriptive error, this is true.



Related Topics



Leave a reply



Submit