Using NodaTime to parse an input and output different dateTime formats

I am currently using NodaTime to parse dates and output dates

public static string nodaTimeTest6(string input)
{
    var defaultValue = new OffsetDateTime(new LocalDateTime(2000, 1, 1, 0, 0), Offset.Zero);
    var pattern = OffsetDateTimePattern.Create("yyyy-MM-dd'T'HH:mm:sso<m>", CultureInfo.InvariantCulture, defaultValue);
    var result = pattern.Parse(input);

    return result.Value.Month + "/" + result.Value.Day + "/" + result.Value.Year + " " + result.Value.ClockHourOfHalfDay;
}

The input, for example, is this: 2014-03-11T02:00:00-07:00

If my return statement is the following: return result.Value.ToString(), then the output would look like this: 2014-03-11T02:00:00-07

I understand the use of properties with NodaTime (which is a life saver), however, I am interested in outputs like this:

yyyy-MM-dd HH:mm:ss

yyyyMMdd HH:mm:ss

dd/MM/yyyy hh:mm

So I tried to change my return statement to this:

return result.Value.Month + "/" + result.Value.Day + "/" + result.Value.Year + " " + result.Value.Hour + ":" + result.Value.Minute;

The final output of that format is: 3/11/2014 2:0

Is there anyway to craft the output so it's a fixed format like 03/11/2014 02:00

I know that if I input an 01 as my month, the output would be 1/11/2014 instead of 01/11/2014

Answers


You can send the format to the ToString method:

return result.Value.ToString("dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture);

As ANeves mentions, you can use the BCL-style formatting using ToString(pattern, IFormatProvider), but it's also worth noting that all pattern objects already support a Format(value) method in addition to Parse(string), so you could also write:

var displayPattern = OffsetDateTimePattern.Create("MM/dd/yyyy' 'HH:mm", CultureInfo.InvariantCulture, defaultValue);
return displayPattern.Format(result.Value);

Which is perhaps more consistent with using patterns for parsing, and also happens to be more efficient if you can keep hold of the pattern and use it more than once.

The Noda Time user guide has a section on Text handling that covers this in more detail.

Not directly related to your question, but: if you're formatting an OffsetDateTime for display without including the offset, you'd normally want to convert it to a LocalDateTime (perhaps with a fixed-offset time zone) to ensure that the results are comparable. As it stands, you'll return the same string for inputs of 2014-03-11T02:00:00-07:00 and also e.g. 2014-03-11T02:00:00-08:00. Perhaps that's okay for your use case.


Need Your Help

How to model structures such as family trees in document databases

document-database ravendb

I have been looking into document databases, specifically RavenDb, and all the examples are clear and understandable. I just can't find any example where we do not know beforehand how many levels a...

Float form elements within list

css-float html-lists html-form

I am trying to achieve the following effect, where here i'm using ( ) to represent a radio button: