|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Всем доброго дня. У пользователя в системе формат даты стоит такой: ddd dd.mm.yyyy, соответственно, все даты во всех программах высвечиваются так: Пн 23.06.2014. Есть vsflexgrid, там поле дата, и соответственно, там также дата высвечивается: Пн 23.06.2014. Раньше, когда был обычный формат даты: dd.mm.yyyy, такая процедура срабатывала нормально (проверяет, если дата меньше текущей, то подсвечивает красным, т.е. она уже просрочена) Код: vbnet 1.
Теперь это преобразование не подходит. Помогите, как правильно переписать этот код, исходя из любого формата даты (он необязательно может быть таким, как я выше привела из примера). Заранее всем спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 07:29 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Настенькатакая процедура срабатывалатакая процедура сама по себе несколько дикая, зачем форматировать дату в текст и сверять между собой текстовые строки? Надо преобразовывать аргументы в тип Date и сверять между собой даты. Соответственно, нужно парсить flexcpText в дату и сверять с текущей (без всякого форматирования). Соответственно, нужно написать парсер, который считывает и расшифровывает текущий системный формат даты и в соответствии с ним обрабатывает входящую строку. CDate тут бессилен. А вообще - как данные вообще попадают в flexgrid? может лучше там поколдовать - красить данные заранее при заполнении грида или сделать признак в скрытом столбце или переформатировать дату в нужный формат.... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 08:22 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Настенька, как то так. На самом деле гарантий что это будет работать с теми РАЗНЫМИ и ОТ БАЛДЫ примерами констант что я написал нет (почему-то работает). Но если на тек. клиентском компьютере он эти даты пишет (в формате своей системы), а потом на том же компе программа их читает, то IsDate будет true и сравниваться будет все правильно. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 08:23 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Дим, я проверил - такой формат "ddd dd.mm.yyyy" CDate понимать не хочет, даже если он прописан в системе. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 08:30 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
А вот если клиент сохраняет форматированный текст у себя, а потом это читается на другом компе (с другими региональными настройками), то это может и не прокатить, как Шокер намекнул. Но я лично такими фишками пользуюсь. Т.е. например дата хранимая в БД (как дата) на русском и американском компе будет в проге отображаться по разному. Или например могу в реестр записать CStr(as Date) а потом точно также оттуда вытащить как CDate(As String). На ДАННОМ компе проблем никогда не будет, но IsDate все-таки лучше проверять (а вдруг юзер мазохист и форматы постоянно меняет). Это можно долго рассуждать... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 08:32 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Shocker.Pro, надоело. подскажи чего-нибудь сам. Я тут счас более умное дело делаю - впихиваю системную иконку (типа SIID_HELP) в заголовок формы. Сделаю, расскажу в соседней теме. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 08:36 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Вот проверила сейчас этот код (поставила формат даты в системе ddd dd.mm.yyyy), выдает false, даты не сравнивает никак Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Люди добрые, ну помогите. Проблема не решена. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 08:44 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Ну знаете Код: vbnet 1.
Да, при вашем формате выдает ошибку. Значит функция тупая такая. Хотя я не думал что настолько. Настенька, парсер пиши. Причем под каждого клиента видимо свой. Для указанного случая видимо достаточно убрать начало строки до первого пробела, день недели никакой доп. информации все одно не несет. Или храни даты как Date (неважно что там высвечивается). И сравнивай то что хранишь, а не то что высвечиваешь. В принципе Шокер все правильно тебе сказал. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 09:15 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Дмитрий77, помогите пож-та правильно написать этот парсер. Например, я же не знаю точно, какой формат даты будет стоять у пользователя на компьютере. Варианты: Ср 01.01.2014, Ср01.01.2014 и т.д. (с пробелом, без пробела) Как правильно его написать? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 09:52 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Настенька, >Варианты: Ср 01.01.2014, Ну берешь например вот так Код: vbnet 1.
и сравниваешь >Ср01.01.2014 Код: vbnet 1.
На любое извращение пишешь свое извращение. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 10:29 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Мое сообщение 16214774 проигнорировано? НастенькаНапример, я же не знаю точно, какой формат даты будет стоять у пользователя на компьютере.его нужно считывать системными функциями расшифровывать дату в соответствии с ним. Это не самая простая задача, поэтому я предлагаю зайти с другой стороны, поэтому и задал встречный вопрос. ЗЫ: Кстати, пользователь в вырожденном случае может поставить дату в формате dd-mm например (без года) и ваша программа вообще не будет работать правильно. Так что лучше все-таки не отдавать данные на откуп пользователю. Расскажите, как данные попадают в сетку. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 10:31 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Пиши изначально свою программу так, чтоб она хранила данные либо в Date, либо в любом но известном программе (и тебе) формате. Из твоего формата дату всегда можно достать и отобразить в тек. системном. Код: vbnet 1.
Но не надо путать отображение и то как оно хранится. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 10:36 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Спасибо всем за ответы, вы мне очень помогли, проблема решена. :-). Всем хорошего дня. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:03 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Shocker.ProНастенькаНапример, я же не знаю точно, какой формат даты будет стоять у пользователя на компьютере.его нужно считывать системными функциями расшифровывать дату в соответствии с ним. Это не самая простая задача, Если CDate настолько гнилая, то да, надо искать API и вытаскивать формат. А потом парсить в соответствии с ним. Здесь поддерживаю. Но я в (видимо этих) API копался только однажды, когда сортировал API-шный ListView по дате. Поищите мои топики (Listview + API + сортировка по дате) если интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:12 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Дмитрий77Но я в (видимо этих) API копался только однажды, когда сортировал API-шный ListView по дате. Поищите мои топики (Listview + API + сортировка по дате) если интересно. ГЫ. И кстати моя сортировка в указанном вами дебильном формате Пн 23.06.2014 подглючивает видимо по тем же причинам (хотя и не вылетает, видимо проверки делаю). Я именно показываю в Current System Format и сравниваю именно хитро форматированные строки а не даты. И кстати по причине оч. низкой скорости сравнения именно дат (в десятки раз). И не буду я даже сейчас это у себя лечить. При стандартных нормальных форматах (хоть французских, хоть английских, хоть китайских) - когда выбираешь страну а не отсутствующую по дефолту в комбобоксе отсебятину сортирует правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:24 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Я все таки залез в свой код. Что я делаю, так это достаю дату DateFromString(hMem) т.е. через VarDateFromStr И VarDateFromStr не справляется. Хотя я уже догадываюсь что собака зарыта в Код: vbnet 1.
Потому что GetUserDefaultLCID -это dd.MM.yyyy , а не ddd dd.MM.yyyy , т.е. не отсебятина, кот. юзер напридумал своими кривыми ручонками. И отсюда коммент: Код: vbnet 1. 2.
В случае API я думаю есть над чем поколдовать, чтобы это полечить. А вот CDate очевидно умеет только GetUserDefaultLCID GetUserDefaultLCID function Caution If the user default locale is a custom locale, an application cannot accurately tag data with the value or exchange it. In this case, the application should use GetUserDefaultLocaleName in preference to GetUserDefaultLCID. Ну, т.е направление понятно. Надо использовать VarDateFromStr и вместо GetUserDefaultLCID делать что-то другое, тогда будет работать. Но мне лично в это врубаться счас неохота. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 11:50 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
VarDateFromStr function Возможно в моем API-случае причина еще в этом флаге, кот. у меня в коде: авторLOCALE_NOUSEROVERRIDE Uses the system default locale settings, rather than custom locale settings. Ну т.е. надо скормить в VarDateFromStr правильный формат 1) текущего пользователя 2) и не дефолтный, а именно с учетом того что юзер наковырял в язык и рег. стандарты в дополнение к дефолтному Собственно "собака зарыта на этом участке площадью 1 кв.км". ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2014, 12:04 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Дмитрий77 VarDateFromStr function Возможно в моем API-случае причина еще в этом флаге, кот. у меня в коде: Ну т.е. надо скормить в VarDateFromStr правильный формат ... 2) и не дефолтный, а именно с учетом того что юзер наковырял в язык и рег. стандарты в дополнение к дефолтному А вот и не получается ничего. CStr(as Date) (частный случай Now() as String ) всегда форматирует согласно кастомизированному формату Short Date (по умолчанию он совпадает с одним из дефолтных, но в случае "ddd dd.mm.yyyy" - не совпадает) Что до CDate (as String), то это граффер над VarDateFromStr Код: plaintext 1. 2. 3. 4. 5. 6.
Играться можно только выделенными параметрами. LCID - это locale identifier -целое число Чтоб понятней: 1049 -русский 1033 -английский Причем каких-то LCID-ов отличных от зарезервированных (которые учитывают нестандартные настройки типа "ddd dd.mm.yyyy" и которые бы можно было вычислить) как я понял не существует. Что до dwFlags -единственный интересный флаг это LOCALE_NOUSEROVERRIDE , но его отсутствие/присутствие ничего не дает, проверял. Скорее всего, имеется ввиду язык системы(дефолтный)/язык юзера Т.е. не удается заставить VarDateFromStr понимать "ddd dd.mm.yyyy" , она смотрит на LCID, а LCID информации о нестандартных Short Date не предоставляет. Это объясняет почему CDate ( "ddd dd.mm.yyyy" as String) также не работает. Все, больше параметров нет. Shocker.Pro, который считывает и расшифровывает текущий системный формат даты.... Что имел ввиду? Как прочитать текущий системный формат даты? Есть ф-ции типа EnumDateFormats function , но у них аргумен все тот же LCID Locale, то бишь 1049,1033 Понятно что custom format они не вернут. Потому что вопрос конечно интересный. И сортировка ListView у меня для случая "ddd dd.mm.yyyy" не работает, по тем же причинам, по которым возникли проблемы у автора топика. Т.е. меня это в итоге зацепило. Какие еще идеи кроме "парсить ручками в каждом конкретном случае"? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2014, 10:37 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
я не знаю, предполагал, что надо гуглить, с уверенностью, что прочитать его можно. есть смешной способ - попросить систему отформатировать заранее известную дату типа 22-11-3333 и посмотреть, что куда попало )) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2014, 10:44 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Shocker.Proя не знаю, предполагал, что надо гуглить, с уверенностью, что прочитать его можно. Его надо не просто просчитать, его надо подставить в ф-цию VarDateFromStr (или какую другую ???). И я вроде как пришел к выводу, что не получается. Shocker.Proесть смешной способ - попросить систему отформатировать заранее известную дату типа 22-11-3333 и посмотреть, что куда попало )) Не,ну DateSerial() А дальше? Ковырять и парсить ручками? Плохой вариант. Если система позволяет задавать нестандартные форматы, значит она должна уметь их парсить назад в Date. Должен быть способ. Хотя твой пример с dd-mm например (без года) заставляет задуматься насчет "должна". А с другой стороны, почему нет, должна подставить дефолтный год тогда. Код: vbnet 1. 2. 3. 4.
GetDateFormat function -но она похоже именно форматирует в заданном формате, а не дает тек. формат. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2014, 11:23 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Получить форматированную дату as String (без VB-шного Format) несложно. Я намеренно упростил и использую lpDate=NULL //=Now() Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Результат: Код: vbnet 1. 2. 3. 4.
Очевидно, что CStr (as Date) делает следующее: 1) Вычисляет тек. LCID (=1049) 2) Вынимает из настроек OS "ddd dd.MM.yyyy" (Short Date Format) 3) Запускает код типа того что я накатал Т.е. по сути нужно следующее: 1) Вычислить тек. LCID (это не проблема - GetUserDefaultLCID function или ей подобные) 2) Вычислить из настроек OS "ddd dd.MM.yyyy" (тупо формат как там забит) Вопрос как? 3) обратный парсер dd->Число as Long, MM -месяц as Long Вопрос что за ф-ция? Очевидно, что упомянутая VarDateFromStr==CDate(As String) берет на вход только LCID, а вместо пункта (2) подставляет дефолты на основе LCID, но при этом в системе существует ф-ция "обратный парсер" ибо очевидно что VarDateFromStr ей пользуется. Для начала надо понять что это за ф-ция. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2014, 12:45 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
http://vbnet.mvps.org/code/locale/localedates.htm module.bas: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180.
form1.frm Create a form containing 13 textboxes named Text0 through Text12 (not in a control array). Add labels as desired, and a command button (Command1). Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2014, 12:52 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Konst_One, Ну, отлично. Из всего что там нарисовано полезно вот это:Дмитрий772) Вычислить из настроек OS "ddd dd.MM.yyyy" (тупо формат как там забит) Вопрос как? Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Продвинулись на один шаг. Можем написать свою CStr(As Date): Код: vbnet 1. 2. 3. 4. 5. 6.
Но мы занимаемся обратной задачей. И остался вопрос: Дмитрий773) обратный парсер dd->Число as Long, MM -месяц as Long Вопрос что за ф-ция? Еще раз. VarDateFromStr формат на вход не принимает, она его как-то внутренне вычисляет, но вычисляет дефолтный (а не тот, что мы сейчас успешно получили) и подсовывает ее в какую-то функцию-парсер , что намекает на существование таковой. Т.е. требуется понять, что за ф-ция. functionXXX (StringwithDate, ByVal lpFormat As String) As Date либо functionXXX (StringwithDate, ByVal lpFormat As String) As SYSTEMTIME Ну, результат естественно out_ ByRef ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2014, 14:09 |
|
Формат даты и правильное его преобразование
|
|||
---|---|---|---|
#18+
Короче, это нерешаемая задача. И что касается VarDateFromStr==CDate(As String), то все она делает правильно. Я понял, она смотрит на КАСТОМИЗИРОВАННЫЕ настройки, а не на дефолтные. Код: vbnet 1. 2. 3. 4.
Я хочу сказать, что не любые ДЕБИЛИЗИРОВАННО-КАСТОМИЗИРОВАННЫЕ настройки можно в принципе отпарсить (да еще и однозначно) в обратную сторону. ddd dd.MM.yyyy -как раз из этой области. Настенька Варианты: ... Ср01.01.2014 и т.д. (... без пробела) Как правильно его написать? Ага, верх дебилизма. Если написать формат ddddd.MM.yyyy, то он его даже в строку нормально не сконвертирует, куда уж там обратно. Скажем так, на месте разработчиков виндов я бы тупо запретил подобную кастомизацию в принципе. Там есть комбобокс, в выпадающем списке несколько разумных вариантов, которые парсятся туда и обратно без проблем, этого достаточно. Все остальное - бред сивой кобылы. И я вообще не понимаю, какое отношение ddd dd.MM.yyyy имеет к КРАТКОМУ формату даты. Блин, повелся, целый день на какую-то фигню потратил. Тема раскрыта и закрыта. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2014, 15:01 |
|
|
start [/forum/topic.php?fid=60&gotonew=1&tid=2156293]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
164ms |
get topic data: |
8ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 294ms |
total: | 558ms |
0 / 0 |