как указать язык месяца (CultureInfo) в формате Lotusscript (сейчас дд/ммм/гггг)

Этот вопрос представляет собой версию LOTUSCRIPT для datetime.tostring month and day language

Необходимо описание: мне нужна строка даты в формате дд/ммм/гггг (например: "28 февраля 2014"). Я не хочу использовать английский (intl) язык для этих трех букв, и не региональные настройки по умолчанию, используемые в ЛОКАЛЬНОМ клиенте.

Ограничения:

  1. Используемый программный язык: Lotusscript на стороне клиента в Lotus Notes.
  2. Я не могу изменить региональные настройки клиентского компьютера. Едва ли приемлемый специализированный для Lotus Notes реестр болезненный (например: http://searchdomino.techtarget.com/tip/Resolve-Domino-date-format-problems-for-dd-mm-yyyy-format)

Я думаю, что format$ не решит мою проблему. Что я могу использовать? Моим последним средством будет выбрать случай месяца (сейчас) случай 1: resu = resu + " jan " ....

Любая лучшая идея? Заранее спасибо за такую ​​тему "дежа вю".

[Отредактировано. Ранее я написал «Я не хочу по-английски», хотя следовало бы сказать «Я не хочу». Формат в LS ВСЕГДА возвращает английский ]


person Emmanuel Gleizer    schedule 12.06.2014    source источник
comment
Мне понадобится некоторое время, чтобы проверить, а затем я отмечу один из ответов принятым ответом. Спасибо за ваш ответ, это действительно помогло! NB Я чувствую, что nempoBu4 уважает именно этот вопрос, но Фил Джонс элегантен. Для меня честь выбирать между двумя.   -  person Emmanuel Gleizer    schedule 15.06.2014


Ответы (3)


Если вы используете Windows, вы можете использовать WinApi GetDateFormat функция. Для этой функции вам необходимо создать SYSTEMTIME структуру. Также вам необходимо использовать Language Identifier Constants and Strings< /a> и Day, Month, Year, and Era Format Pictures разделы для настройки языка и формата даты и времени.
Вот пример:

'Declarations
Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type

Declare Function GetDateFormat Lib "kernel32" Alias "GetDateFormatA" (_
Byval Locale As Long,_
Byval dwFlags As Long,_
lpDate As SYSTEMTIME,_
Byval lpFormat As String,_
Byval lpDateStr As String,_
Byval cchDate As Long) As Long

Function FormatDate(value As Variant, locale As Long, formatString As String) As String

    Dim buffer As String, systemTime As SYSTEMTIME

    systemTime.wYear = Year(value)
    systemTime.wMonth = Month(value)
    systemTime.wDay = Day(value)

    buffer = String(255, 0)

    GetDateFormat locale&, 0, systemTime, formatString$ , buffer, Len(buffer)

    FormatDate$ = Left$(buffer, Instr(1, buffer, Chr$(0)) - 1)

End Function

'Usage
MessageBox FormatDate(Now, &h40c, "dd MMM yyyy")
'&h40c - is fr-FR locale (0x040c)


Другой способ — использовать LS2J. Для этого вы можете использовать класс
SimpleDateFormat и его format метод. Также вам необходимо использовать класс Locale и < класс href="http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html" rel="nofollow">Calendar для установки языка и даты.
Вот пример:

'Declarations
Uselsx "*javacon"'Include this for using Java objects in LotusScript

Function FormatDate(value As Variant, language As String, country As String, formatString As String) As String

    Dim javaSession As New JavaSession

    Dim localeClass As JavaClass
    Dim locale As JavaObject

    Dim calendarClass As JavaClass
    Dim calendar As JavaObject

    Dim dateFormatClass As JavaClass
    Dim dateFormat As JavaObject

    Set localeClass = javaSession.GetClass("java/util/Locale")
    Set locale = localeClass.CreateObject("(Ljava/lang/String;Ljava/lang/String;)V", language$, country$)

    Set calendarClass = javaSession.GetClass("java/util/Calendar")
    Set calendar = calendarClass.GetMethod("getInstance", "()Ljava/util/Calendar;").Invoke()
    'You need to subtract 1 from month value
    Call calendar.set(Year(value), Month(value) - 1, Day(value))

    Set dateFormatClass = javaSession.GetClass("java/text/SimpleDateFormat")
    Set dateFormat = dateFormatClass.CreateObject("(Ljava/lang/String;Ljava/util/Locale;)V", formatString$, locale)

    FormatDate$ = dateFormat.format(calendar.getTime())

End Function

'Usage
MessageBox FormatDate(Now, "fr", "FR", "dd MMM yyyy")

В этом примере я использовал этот конструктор для получения объекта Locale. Коды языков можно получить здесь, а коды стран — здесь.
Для объекта SimpleDateFormat я использовал этот конструктор.

person nempoBu4    schedule 13.06.2014
comment
Оба решения соответствуют моим потребностям, я их проверю! Спасибо - person Emmanuel Gleizer; 15.06.2014
comment
Вау! Я нашел подход API немного тяжелым для этой потребности... с подходом aLS2J вы охватываете все области! Большое спасибо! - person Emmanuel Gleizer; 16.06.2014
comment
Указание языка в форме/библиотеке скриптов не влияет на результат форматирования. Java работает с указанием языка (внимание: выбор ограничен!) Ядро32 принимает язык, как вы упомянули, &h409 - это локаль en-US (0x0409), весь список можно найти по адресу getcodesamples.com/src/25B6B398/5BB4C48A - person Emmanuel Gleizer; 17.06.2014

Я полагаю, что Format(Now, "dd mmm yyyy") будет выводить месяц на английском языке, но я не уверен на 100%.

Если нет, вы можете использовать

Day(Now) & " " & Mid("JanFebMarAprMayJulJunAugSepOctNovDec", 3* Month(Now) -2, 3) & " " & Year(Now)

person Phil M Jones    schedule 12.06.2014
comment
Разве это не должно быть (3 * (Month(Now) - 1)+1) или 3 * Month(Now) - 2 ? - person Torsten Link; 12.06.2014
comment
Торстен, вы абсолютно правы - я отредактировал свой пост, чтобы исправить это, спасибо. - person Phil M Jones; 12.06.2014
comment
Мне нравится крошечное письмо с серединой, которое действительно короче, чем выбранный регистр! - person Emmanuel Gleizer; 15.06.2014

Я не вижу лучшего способа, чем вручную построить строку даты в вашей собственной функции:

Function FormatDate(sourceDate as Variant) As String

    Dim months[1 to 12] as String
    months[1] = "Jan"
    months[2] = "Feb"
    months[3] = "Mar"
    months[4] = "Apr"
    months[5] = "May"
    months[6] = "Jun"
    months[7] = "Jul"
    months[8] = "Aug"
    months[9] = "Sep"
    months[10] = "Oct"
    months[11] = "Nov"
    months[12] = "Dec"

    Dim monthPart as String
    Dim dayPart as String
    Dim yearPart as String

    dayPart = Format(sourceDate, "dd")
    yearPart = Format(sourceDate, "yyyy")
    monthPart = months[Month(sourceDate)]

    FormatDate = dayPart & " " & monthPart & " " & yearPart

End Function
person Ken Pespisa    schedule 12.06.2014
comment
Спасибо, это альтернатива выбранному регистру, который я собирался использовать, но я предпочитаю крошечное письмо, предложенное Филом. - person Emmanuel Gleizer; 15.06.2014