Re: String to FILETIME
"Michael Tissington" <nospam@nospam.com> ha scritto nel messaggio
news:%23VdQ%23ADgJHA.5328@TK2MSFTNGP06.phx.gbl...
How can I parse the following string as a FILETIME ?
"2009-01-23T11:57:26-06:00"
To add to what I previously wrote, unfortunately in this string there is a
specification of a time zone (e.g. "-06:00").
I've never done that with pure C++; however I've found that the .NET
framework offers very convenient classes (as usual!) to do this kind of
conversion and for parsing a string in the format you requested.
So, I developed a small C++/CLI routine to do that job. It uses the
System.DateTime.ParseExact() method to parse the input string, and the
System.DateTime.ToFileTime() method to convert the resulting DateTime object
to a Windows file time (represented as __int64).
I used this string to map your string format: "yyyy-MM-ddTHH:mm:sszzz" (note
the trailing "zzz" characters that represent the time zone specification).
<code language="C++/CLI">
/// <summary>
/// Converts a UTC date time string in a Windows file time.
/// </summary>
/// <param name="utc">Input string in UTC format, e.g.
2009-01-23T11:57:26-06:00</param>
/// <returns>The Windows file time corresponding to the input
string.</returns>
/// <exception cref="System.FormatException">When input string format is
wrong.</exception>
/// <exception cref="System.ArgumentOutOfRangeException">The resulting file
time would represent
/// a date and time before 12:00 midnight January 1, 1601 C.E.
UTC.</exception>
__int64 UTCDateTimeToFileTime(String^ utc)
{
// Parse input string
String^ expectedFormat = "yyyy-MM-ddTHH:mm:sszzz";
System::DateTime ^ resultDateTime = System::DateTime::ParseExact(
utc,
expectedFormat,
System::Globalization::CultureInfo::InvariantCulture
);
// Convert it to Windows file time
return resultDateTime->ToFileTime();
}
</code>
You can use this function in code like this:
<code language="C++/CLI">
// *** TEST ***
int main(array<System::String ^> ^args)
{
String^ inputDate = "2009-01-23T11:57:26-06:00";
try
{
Console::WriteLine("{0} corresponds to file time {1}.",
inputDate, UTCDateTimeToFileTime(inputDate));
}
catch (System::FormatException^ ex)
{
Console::WriteLine("Error in parsing date time string:");
Console::WriteLine(ex->Message);
}
return 0;
}
</code>
The beauty of the C++/CLI extensions is that you can use the powerful and
rich .NET Framework library into C++ code.
I don't know if there is something "pure native" (i.e. not in the .NET
Framework, just pure native C++ code) to do that, but I've not found
anything (e.g. it seems to me that ATL/MFC class CTime does not support time
zone conversion...).
For the sake of completeness, I report the C# function I developed in the
beginning (in fact, I developed the C# function first, and then converted it
to C++/CLI - in fact, C# is more "natural" language to develop for the .NET
framework, IMHO):
<code language="C#">
/// <summary>
/// Converts a UTC date time string in a Windows file time.
/// </summary>
/// <param name="utc">Input string in UTC format, e.g.
2009-01-23T11:57:26-06:00</param>
/// <returns>The Windows file time corresponding to the input
string.</returns>
/// <exception cref="System.FormatException">When input string format is
wrong.</exception>
/// <exception cref="System.ArgumentOutOfRangeException">The resulting file
time would represent
/// a date and time before 12:00 midnight January 1, 1601 C.E.
UTC.</exception>
static public long UTCDateTimeToFileTime(string utc)
{
// Parse input string
string expectedFormat = "yyyy-MM-ddTHH:mm:sszzz";
DateTime resultDateTime = DateTime.ParseExact(utc, expectedFormat,
CultureInfo.InvariantCulture);
// Convert it to Windows file time
return resultDateTime.ToFileTime();
}
</code>
And this is a working C# program to test that:
<code language="C#">
//////////////////////////////////////////////////////////////////////////
/// Shows how to convert an UTC date time to a Windows file time.
///
/// by Giovanni Dicanio
//////////////////////////////////////////////////////////////////////////
using System;
using System.Globalization;
namespace ConsoleApplication1
{
class Program
{
/// <summary>
/// Converts a UTC date time string in a Windows file time.
/// </summary>
/// <param name="utc">Input string in UTC format, e.g.
2009-01-23T11:57:26-06:00</param>
/// <returns>The Windows file time corresponding to the input
string.</returns>
/// <exception cref="System.FormatException">When input string
format is wrong.</exception>
/// <exception cref="System.ArgumentOutOfRangeException">The
resulting file time would represent
/// a date and time before 12:00 midnight January 1, 1601 C.E.
UTC.</exception>
static public long UTCDateTimeToFileTime(string utc)
{
// Parse input string
string expectedFormat = "yyyy-MM-ddTHH:mm:sszzz";
DateTime resultDateTime = DateTime.ParseExact(utc,
expectedFormat, CultureInfo.InvariantCulture);
// Convert it to Windows file time
return resultDateTime.ToFileTime();
}
// *** Test ***
static void Main(string[] args)
{
string inputDate = "2009-01-23T11:57:26-06:00";
try
{
Console.WriteLine("{0} corresponds to file time {1}.",
inputDate, UTCDateTimeToFileTime(inputDate));
}
catch (System.FormatException ex)
{
Console.WriteLine("Error in parsing date time string:");
Console.WriteLine(ex.Message);
}
return;
}
}
}
</code>
HTH,
Giovanni