我想将系统日期时间转换为特定格式。我的系统格式是dd / mm / yy我想转换为mm / dd / yyyy,所以我使用的是StrToDateDef。我只需要使用StrToDateDef因为日期是字符串,如果有一个字符串而不是日期我将使用默认日期。我的代码在
之下 str := '30/01/14';
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FmtStngs);
FmtStngs.DateSeparator := '/';
FmtStngs.ShortDateFormat := 'mm/dd/yyyy';
FmtStngs.TimeSeparator := ':';
FmtStngs.LongTimeFormat := 'hh:nn';
date := StrToDateDef(str,01/28/2013,FmtStngs);
我期待这个日期为'01 / 30/2014',但它将以'30 / 01/14'的形式出现。我做错了什么?
答案 0 :(得分:7)
此代码中存在多个错误:
首先,传递给TFormatSettings
例程的StrToDateDef
是您传递的字符串的格式设置(而不是出现的日期时间变量,稍后会详细介绍)。
当您传递'30/01/14'
时,ShortDateFormat
应该是'dd/mm/yyyy'
而不是'mm/dd/yyyy'
然后你传递的默认值等于在12.12.1899午夜之后的1ms(因为你实际上传递1除以28除以2014)。使用EncodeDate(2013, 1, 28)
中的DateUtils.pas
。
然后你说
我期待这个日期为'01 / 30/2014',但它将以'30 / 01/14'的形式出现。
您正在查看TDateTime
变量,它将根据调试器的Windows系统本地设置进行格式化。而已。你没有一个字符串,而是一个浮点值(这就是TDateTime所代表的),它以字符串形式呈现给你,使其可读。
此外,我认为结果应该是传递的默认日期,因为传递的ShortDateFormat与您传递的字符串的值不匹配(尝试将30放入月份部分)。