in csharp/EPAM.Deltix.HdTime/Formatter.cs [571:650]
public static String Format(HdDateTime time, String format, IFormatProvider formatProvider)
{
String localFormat;
bool isDefaultFormat = false;
if (String.IsNullOrEmpty(format))
{
isDefaultFormat = true;
localFormat = Formatter.GetDefaultFormat();
}
else
{
localFormat = String.Copy(format); // Does not actually copy an interned string
}
Byte timestampModulo = time.TimestampModulo;
Boolean isZeroModulo = timestampModulo == 0;
Boolean isZeroModuloTens = timestampModulo / 10 == 0;
// ptf is PreciseTimeFormat
Int32 ptfPosition, ptfSymbolsCount;
Boolean isPtfLowerCase;
Boolean isPtfFound = Formatter.FindPreciseTimeFormat(localFormat, out ptfPosition, out ptfSymbolsCount, out isPtfLowerCase);
if (!isPtfFound)
{
return time.RawDateTime.ToString(format);
}
// if format is in the middle.
if (ptfPosition + ptfSymbolsCount < localFormat.Length)
{
throw new FormatException(String.Format("Format {0} is unsupported.", format));
}
Boolean isPtfUpperCase = !isPtfLowerCase;
// case, when we can substring format, because nanoseconds should not be represented in formatting result.
if (isPtfUpperCase && (isZeroModulo || (ptfSymbolsCount == 1 && isZeroModuloTens)))
{
return time.RawDateTime.ToString(localFormat.Substring(0, localFormat.Length - ptfSymbolsCount));
}
Boolean isZeroModuloCount = timestampModulo % 10 == 0 && ptfSymbolsCount == 2;
if (isPtfUpperCase && isZeroModuloCount)
{
localFormat = localFormat.Substring(0, localFormat.Length - 1);
ptfSymbolsCount--;
}
if (isDefaultFormat)
{
localFormat = Formatter.PreciseTimeFormatAdjusted;
}
else
{
if (isPtfUpperCase && ptfSymbolsCount > 0)
CorrectDateTimeFormat(localFormat, ptfPosition);
Formatter.ReplaceChars(localFormat, ptfPosition, ptfSymbolsCount, '#');
}
Formatter.ReplaceChars(localFormat, ptfPosition, ptfSymbolsCount, '#');
try
{
String dateTimeFormatterResult = time.RawDateTime.ToString(localFormat);
Formatter.RollbackPreciseTimeSourceReplacement(dateTimeFormatterResult,
dateTimeFormatterResult.Length - ptfSymbolsCount, ptfSymbolsCount, timestampModulo);
return dateTimeFormatterResult;
}
finally
{
if (0 != ptfSymbolsCount && !isDefaultFormat)
Formatter.RollbackPreciseTimeFormatReplacement(
localFormat,
ptfPosition - Formatter.DateTimeFormatSymbolsCount,
ptfSymbolsCount + Formatter.DateTimeFormatSymbolsCount,
isPtfLowerCase);
}
}