Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,7 @@ public static string MSFormatDateTime(string dateTime, string format, string lan
{
try
{
string locale = GetCultureInfo(lang).Name;
CultureInfo ci = GetCultureInfo(lang);

XsdDateTime xdt;
if (!XsdDateTime.TryParse(dateTime, XsdDateTimeFlags.AllXsd | XsdDateTimeFlags.XdrDateTime | XsdDateTimeFlags.XdrTimeNoTz, out xdt))
Expand All @@ -375,8 +375,13 @@ public static string MSFormatDateTime(string dateTime, string format, string lan
}
DateTime dt = xdt.ToZulu();

// If format is the empty string or not specified, use the default format for the given locale
return dt.ToString(format.Length != 0 ? format : null, new CultureInfo(locale));
// If format is the empty string or not specified, use the default date or time format for the given locale
if (format.Length == 0)
{
format = isDate ? "d" : "T";
}

return dt.ToString(format, ci);
}
catch (ArgumentException)
{ // Operations with DateTime can throw this exception eventualy
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Globalization;
using System.IO;
using System.Tests;
using System.Xml.Xsl;
using Xunit;

Expand Down Expand Up @@ -44,5 +46,71 @@ public void ValueOfInDebugMode()
Assert.Equal("This is my class info", outWriter.ToString());
}
}

[Fact]
public void FormatDateWithEmptyFormatString()
{
const string Xml = @"<?xml version=""1.0"" encoding=""UTF-8""?><root/>";
const string Xsl = @"<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
xmlns:ms=""urn:schemas-microsoft-com:xslt"">
<xsl:output method=""text"" />
<xsl:template match=""/"">
<xsl:value-of select=""ms:format-date('2001-02-03T01:02:03', '')"" />
</xsl:template>
</xsl:stylesheet>";

using (new ThreadCultureChange("en-GB"))
using (var outWriter = new StringWriter())
{
using (var xslStringReader = new StringReader(Xsl))
using (var xmlStringReader = new StringReader(Xml))
using (var xslReader = XmlReader.Create(xslStringReader))
using (var xmlReader = XmlReader.Create(xmlStringReader))
{
var transform = new XslCompiledTransform();
transform.Load(xslReader);
transform.Transform(xmlReader, null, outWriter);
}

string result = outWriter.ToString();
DateTime expectedDate = new DateTime(2001, 2, 3, 1, 2, 3, DateTimeKind.Utc);
string expectedResult = expectedDate.ToString("d", new CultureInfo("en-GB"));
Assert.Equal(expectedResult, result);
}
}

[Fact]
public void FormatTimeWithEmptyFormatString()
{
const string Xml = @"<?xml version=""1.0"" encoding=""UTF-8""?><root/>";
const string Xsl = @"<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
xmlns:ms=""urn:schemas-microsoft-com:xslt"">
<xsl:output method=""text"" />
<xsl:template match=""/"">
<xsl:value-of select=""ms:format-time('2001-02-03T01:02:03', '')"" />
</xsl:template>
</xsl:stylesheet>";

using (new ThreadCultureChange("en-GB"))
using (var outWriter = new StringWriter())
{
using (var xslStringReader = new StringReader(Xsl))
using (var xmlStringReader = new StringReader(Xml))
using (var xslReader = XmlReader.Create(xslStringReader))
using (var xmlReader = XmlReader.Create(xmlStringReader))
{
var transform = new XslCompiledTransform();
transform.Load(xslReader);
transform.Transform(xmlReader, null, outWriter);
}

string result = outWriter.ToString();
DateTime expectedTime = new DateTime(2001, 2, 3, 1, 2, 3, DateTimeKind.Utc);
string expectedResult = expectedTime.ToString("T", new CultureInfo("en-GB"));
Assert.Equal(expectedResult, result);
}
}


}
}
Loading