Как отформатировать метку для отображения 12-часового формата времени без AM/PM в VB6?

Я создаю программу для часов с использованием Visual Basic 6, которая использует таймер для отображения времени в метке на главной форме, и у меня есть форма параметров, в которой пользователи могут настраивать несколько параметров, включая изменение формата времени между 12 часами и 24 часами. Часовой формат. Если выбран 12-часовой формат, я также хотел бы позволить человеку переключать отображение AM/PM. В документации нет возможности (из того, что я могу найти) для 12-часового времени без маркера утреннего / дневного времени. Поэтому у меня такой вопрос: как мне отобразить время в 12-часовом формате без AM и PM? Все работает, кроме этого.
Пожалуйста, обратитесь к коду из моей формы параметров ниже и к объявлениям открытых переменных ниже.

Объявления переменных в модуле

Public strTimeFormat As String, strDateFormat As String

Public Const strSecond = "ss"
Public Const strAMPM = "AMPM"
Public Const strColon = ":"

Public strCustom As String, strHourCurrentSelection As String, strMinuteCurrentSelection As String, strTimeCurrentSelection As String

Форма настроек (frmOptions)

Option Explicit

Private Sub chkAMPM_Click()
If chkAMPM.Value = True Then
strTimeCurrentSelection = strHourCurrentSelection + strColon + strMinuteCurrentSelection + strAMPM
End If

End Sub

Private Sub chkSeconds_Click()
If chkSeconds.Value = True Then
strTimeCurrentSelection = strHourCurrentSelection + strColon + strMinuteCurrentSelection + strSecond
Else
strTimeCurrentSelection = strHourCurrentSelection + strColon + strMinuteCurrentSelection
End If

End Sub

Private Sub cmdApply_Click()
strTimeFormat = strTimeCurrentSelection
End Sub

Private Sub cmdCancel_Click()
Unload Me
End Sub

Private Sub cmdOK_Click()
MsgBox "Place code here to set options and close dialog!"
Unload Me
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim i As Integer
'handle ctrl+tab to move to the next tab
If Shift = vbCtrlMask And KeyCode = vbKeyTab Then
    i = tbsOptions.SelectedItem.Index
    If i = tbsOptions.Tabs.Count Then
        'last tab so we need to wrap to tab 1
        Set tbsOptions.SelectedItem = tbsOptions.Tabs(1)
    Else
        'increment the tab
        Set tbsOptions.SelectedItem = tbsOptions.Tabs(i + 1)
    End If
End If
End Sub

Private Sub Form_Load()
'center the form
Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 
End Sub

Private Sub opt12Hour_Click()
opt24NoZero.Enabled = False
opt24Zero.Enabled = False
chkColon.Enabled = False

txtCustomTimeLayout.Enabled = False
txtCustomTimeLayout.BackColor = &H8000000F

opt12NoZero.Enabled = True
opt12Zero.Enabled = True
chkAMPM.Enabled = True

End Sub

Private Sub opt12NoZero_Click()
strHourCurrentSelection = ""
strMinuteCurrentSelection = ""

strHourCurrentSelection = "h"
strMinuteCurrentSelection = "mm"

strTimeCurrentSelection = strHourCurrentSelection + strColon + strMinuteCurrentSelection
End Sub

Private Sub opt12Zero_Click()
strHourCurrentSelection = ""
strMinuteCurrentSelection = ""

strHourCurrentSelection = "hh"
strMinuteCurrentSelection = "mm"

strTimeCurrentSelection = strHourCurrentSelection + strColon + strMinuteCurrentSelection

End Sub

Private Sub opt24Hour_Click()
opt12NoZero.Enabled = False
opt12Zero.Enabled = False
chkAMPM.Enabled = False

txtCustomTimeLayout.Enabled = False
txtCustomTimeLayout.BackColor = &H8000000F

opt24NoZero.Enabled = True
opt24Zero.Enabled = True
chkColon.Enabled = True

End Sub

Private Sub opt24NoZero_Click()
strHourCurrentSelection = ""
strMinuteCurrentSelection = ""

strHourCurrentSelection = "H"
strMinuteCurrentSelection = "mm"

strTimeCurrentSelection = strHourCurrentSelection + strColon + strMinuteCurrentSelection
End Sub

Private Sub opt24Zero_Click()
strHourCurrentSelection = ""
strMinuteCurrentSelection = ""

strHourCurrentSelection = "HH"
strMinuteCurrentSelection = "mm"

strTimeCurrentSelection = strHourCurrentSelection + strColon + strMinuteCurrentSelection

End Sub

Private Sub optCustomTime_Click()
opt12NoZero.Enabled = False
opt12Zero.Enabled = False
chkAMPM.Enabled = False

opt24NoZero.Enabled = False
opt24Zero.Enabled = False
chkColon.Enabled = False

txtCustomTimeLayout.Enabled = True
txtCustomTimeLayout.BackColor = &H80000009

End Sub

Private Sub tbsOptions_Click()

Dim i As Integer
'show and enable the selected tab's controls
'and hide and disable all others
For i = 0 To tbsOptions.Tabs.Count - 1
    If i = tbsOptions.SelectedItem.Index - 1 Then
        picOptions(i).Left = 210
        picOptions(i).Enabled = True
    Else
        picOptions(i).Left = -20000
        picOptions(i).Enabled = False
    End If
Next

End Sub

Private Sub txtCustomTimeLayout_Change()
strTimeCurrentSelection = txtCustomTimeLayout.Text
End Sub

Модуль Public Subs

Public Sub Clock()
frmClock.lblTime.Caption = Format(Now, strTimeFormat)
frmClock.lblDate.Caption = Format(Now, strDateFormat)

End Sub

Событие Timer_Click()

Private Sub tmrClock_Timer()
Clock

End Sub

2 ответа

Простой подход:

Left$(Format$(Now(), "Hh:NnA/P"), 5)

AMPM токен форматирования учитывает текущую локаль.
Он безоговорочно устанавливает 12-часовой режим для часов, но выводит "AM/PM" только тогда, когда ваш язык говорит об этом.

Например, под моим языком, где 24-часовой формат по умолчанию, Format$(Now, "h:m:s AMPM") отформатирует время в соответствии с 12-часовыми правилами, но не будет печатать "AM" или "PM".

Существует другой вкус AMPM маркер: AM/PM, Тот всегда печатает AM или PM, даже если ваш язык не хочет этого.

Поэтому легко убедиться, что AM / PM всегда печатается: вам просто нужно использовать Const strAMPM = "AM/PM" вместо Const strAMPM = "AMPM",

Однако удостовериться, что AM / PM подавлен во всех локалях, - это другое дело: вы не можете сделать это только с помощью форматирования строк. Вам нужно поставить AMPM в строку форматирования, чтобы переключить ее в 12-часовой режим, но если вы это сделаете, AM или PM появятся в выходных данных, если ваш язык говорит об этом.

Поэтому вам нужно сделать Format Функция использует другую локаль. Я написал функцию, которая делает это.

Выберите два идентификатора локали, которые имеют желаемое поведение (один показывает AM/PM, другой подавляет его).
Например

FormatForLocale(Now, "h:m:s ampm", TargetLocaleID:=&H0C09)

напечатает AM или PM, и, например,

FormatForLocale(Now, "h:m:s ampm", TargetLocaleID:=&H0419)

не буду.

Вы бы хранить TargetLocaleID Таким же образом вы сохраняете другие биты строки форматирования и изменяете его на то или иное значение, когда пользователь выбирает или отменяет AM/PM.


Хотя вы можете использовать функцию как есть, в вашем конкретном случае, когда вы строите и сохраняете строку форматирования, вы можете взять бит, который вызывает VarTokenizeFormatString и сохраняет результат вне функции и создает отдельную функцию, которая обрабатывает только токенизацию и сохраняет результат в байтовом массиве. Тогда вы сохраните байтовый массив вместо окончательной строки форматирования, что сохранит ваш пересчет при каждом вызове. VarFormatFromTokens,

Другие вопросы по тегам