On 11/19/2014 9:17 AM, Philippe wrote:
I still don't know how to use at the same time formatStr and FormatSettings in 
FormatDateTime.

i'm not sure i understand your delima... perhaps you are trying to determine how the FormatSettings work and how you can force the same output format on different OSes? i found the following (slightly modified by me for CLI) delphi code that might help... the original code resides at http://www.delphibasics.co.uk/RTL.asp?Name=FormatDateTime

in the code, we output the results of the various FormatDateTime usages... then we change the values of the date and time formatting variables and run the same outputs again...

I´ll like very much to find a tutorial or some example about the good
practice to manage dates and be sure it will do the same thing on different
machines ....

in some cases, you can fall back to delphi tutorials... it can be troublesome in some cases where things are slightly different between FPC/Lazarus and Delphi... the biggest problem i personally run into is that so much example code is GUI oriented and i still code for CLI...

anyway, here is the output of the following code...

*NOTE:* i think we've found a bug in (fpc?) trunk or perhaps it is just an unexpected side effect due to the system's settings... the day and month are reversed in the first separators line... as the comments in the code note, we're trying to work with 5 Jun 49... but this output was done on a US winwhatever (vista) system... it might be getting in the way by forcing mm/dd/yy format from the dd/mm/yy work string... someone else will have to speak to that as i would expect it to do the same in the second output set but it doesn't...


System formatting:
  Working with date string     = 05/06/49 01:02:03.004
  Separators dd/mm/yy hh:nn:ss = 06/05/49 01:02:03
  ShortMonths              mmm = May
  LongMonths              mmmm = May
  ShortDays                ddd = Thu
  LongDays                dddd = Thursday
  ShortDate              ddddd = 5/6/2049
  LongDate              dddddd = Thursday, May 06, 2049
  AMPM                  hhampm = 01AM
  ShortTime                  t = 1:02
  LongTime                  tt = 1:02:03
  2DigitCentury     dd/mm/yyyy = 06/05/2049

Modified formatting:
  Working with date string     = 05-06-49 01_02_03.004
  Separators dd/mm/yy hh:nn:ss = 05-06-49 01_02_03
  ShortMonths              mmm = JUN
  LongMonths              mmmm = JUNE
  ShortDays                ddd = SUN
  LongDays                dddd = SUNDAY
  ShortDate              ddddd = 05-JUN-49
  LongDate              dddddd = SUNDAY 05 of JUNE of 1949
  AMPM                  hhampm = 01morning
  ShortTime                  t = 01_02_03
  LongTime                  tt = 01 _ 02 _ 03 . 004
  2DigitCentury     dd/mm/yyyy = 05-06-1949


===== snip =====
program DTFormatting;

uses SysUtils;

var
  DateStr : String;
  myDate  : TDateTime;

begin
  // Set up our TDateTime variable with a full date and time :
  // 5th of June 2049 at 01:02:03.004  (.004 milli-seconds)
  //
  // Note that 49 is treated as 2049 as follows :
  //               TwoDigitYearCenturyWindow => 50
  //                            Current year => 2008 (at time of writing)
  //      Subtract TwoDigitYearCenturyWindow => 1958
  //            2 digit year to be converted => 49
  //  Compare with the last 2 digits of 1958 => Less
  //      So the year is in the next century => 2049
  // (58 would be converted to 1958)

  WriteLn('System formatting:');

  DateStr := '05/06/49 01:02:03.004';
  WriteLn('  Working with date string     = '+DateStr);

  myDate := StrToDateTime(DateStr);

  // Demonstrate default locale settings

  // Use the DateSeparator and TimeSeparator values
WriteLn(' Separators dd/mm/yy hh:nn:ss = '+FormatDateTime('dd/mm/yy hh:nn:ss', myDate));

  // Use ShortMonthNames
  WriteLn('  ShortMonths              mmm = '+FormatDateTime('mmm', myDate));

  // Use LongMonthNames
  WriteLn('  LongMonths              mmmm = '+FormatDateTime('mmmm', myDate));

  // Use ShortDayNames
  WriteLn('  ShortDays                ddd = '+FormatDateTime('ddd', myDate));

  // Use LongDayNames
  WriteLn('  LongDays                dddd = '+FormatDateTime('dddd', myDate));

  // Use the ShortDateFormat string
  WriteLn('  ShortDate              ddddd = '+FormatDateTime('ddddd', myDate));

  // Use the LongDateFormat string
  WriteLn('  LongDate              dddddd = '+FormatDateTime('dddddd', myDate));

  // Use the TimeAmString
  WriteLn('  AMPM                  hhampm = '+FormatDateTime('hhampm', myDate));

  // Use the ShortTimeFormat string
  WriteLn('  ShortTime                  t = '+FormatDateTime('t', myDate));

  // Use the LongTimeFormat string
  WriteLn('  LongTime                  tt = '+FormatDateTime('tt', myDate));

  // Use the TwoDigitCenturyWindow
WriteLn(' 2DigitCentury dd/mm/yyyy = '+FormatDateTime('dd/mm/yyyy', myDate));

  WriteLn('');
  WriteLn('Modified formatting:');

  // Now change the defaults
  DefaultFormatSettings.DateSeparator      := '-';
  DefaultFormatSettings.TimeSeparator      := '_';
  DefaultFormatSettings.ShortDateFormat    := 'dd/mmm/yy';
  DefaultFormatSettings.LongDateFormat     := 'dddd dd "of" mmmm "of" yyyy';
  DefaultFormatSettings.TimeAMString       := 'morning';
  DefaultFormatSettings.TimePMString       := 'afternoon';
  DefaultFormatSettings.ShortTimeFormat    := 'hh:nn:ss';
  DefaultFormatSettings.LongTimeFormat     := 'hh : nn : ss . zzz';
  DefaultFormatSettings.ShortMonthNames[6] := 'JUN';
  DefaultFormatSettings.LongMonthNames[6]  := 'JUNE';
  DefaultFormatSettings.ShortDayNames[1]   := 'SUN';
  DefaultFormatSettings.LongDayNames[1]    := 'SUNDAY';
DefaultFormatSettings.TwoDigitYearCenturyWindow := 75; // This means 49 is treated as 1949

  // Set up our TDateTime variable with the same value as before
  // **except that we must use the new date and time separators**
  // The TwoDigitYearCenturyWindow variable only takes effect here
  DateStr := '05-06-49 01_02_03.004';
  WriteLn('  Working with date string     = '+DateStr);

  myDate := StrToDateTime(DateStr);

  // Use the DateSeparator and TimeSeparator values
WriteLn(' Separators dd/mm/yy hh:nn:ss = '+FormatDateTime('dd/mm/yy hh:nn:ss', myDate));

  // Use ShortMonthNames
  WriteLn('  ShortMonths              mmm = '+FormatDateTime('mmm', myDate));

  // Use LongMonthNames
  WriteLn('  LongMonths              mmmm = '+FormatDateTime('mmmm', myDate));

  // Use ShortDayNames
  WriteLn('  ShortDays                ddd = '+FormatDateTime('ddd', myDate));

  // Use LongDayNames
  WriteLn('  LongDays                dddd = '+FormatDateTime('dddd', myDate));

  // Use the ShortDateFormat string
  WriteLn('  ShortDate              ddddd = '+FormatDateTime('ddddd', myDate));

  // Use the LongDateFormat string
  WriteLn('  LongDate              dddddd = '+FormatDateTime('dddddd', myDate));

  // Use the TimeAmString
  WriteLn('  AMPM                  hhampm = '+FormatDateTime('hhampm', myDate));

  // Use the ShortTimeFormat string
  WriteLn('  ShortTime                  t = '+FormatDateTime('t', myDate));

  // Use the LongTimeFormat string
  WriteLn('  LongTime                  tt = '+FormatDateTime('tt', myDate));

  // Use the TwoDigitCenturyWindow
WriteLn(' 2DigitCentury dd/mm/yyyy = '+FormatDateTime('dd/mm/yyyy', myDate));
end.
===== snip =====

--
 NOTE: No off-list assistance is given without prior approval.
       Please *keep mailing list traffic on the list* unless
       private contact is specifically requested and granted.
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to