前面我们学习了str.format()中方便快捷的预设日期/时间格式(如date,short)。但你可能会发现,这些预设格式大多是美式风格(比如月/日/年),不一定符合我们的阅读习惯。 如果我们想实现年-月-日 时:分这种完全自定义的格式,应该怎么办呢?答案就是开启str.format()的终极专业模式——使用模式字母(Pattern Letters)来自定义时间的显示格式。学会它,你就能像拼乐高一样,随心所欲地组合出任何你想要的时间文本。 要使用自定义模板,你需要在占位符里,紧跟在date或time说明符后面(用哪个都行,都是告诉程序这是个时间戳),写上你用模式字母组合出来的模板字符串。它的结构是:{索引, date, '你的自定义模板'}。 例如:barTimeText = str.format("K线开盘时间: {0,time,HH:mm:ss}", time) 这里的HH:mm:ss就是由模式字母和分隔符组成的自定义模板。
时间格式大全
要拼装出你想要的时间格式,你首先要认识模式字母这个零件库。每个字母或字母组合,都代表着时间的一个特定部分:
| 模式字母 | 含义 | 示例 (假设时间为2023年9月8日 星期五14:05:07.123 UTC) |
| 年份 (Year) | ||
y, yyyy |
四位年份 | 2023 |
yy |
两位年份 | 23 |
| 月份 (Month) | ||
M |
月份 (1-12) | 9 |
MM |
两位月份 (01-12),不足补零 | 09 |
MMM |
月份缩写 (Jan, Feb…) | Sep |
MMMM |
月份全称 (January, February…) | September |
| 日期 (Day) | ||
d |
月份中的日期 (1-31) | 8 |
dd |
两位月份中的日期 (01-31),不足补零 | 08 |
| 星期 (Day of Week) | ||
E |
星期缩写 (Mon, Tue…) | Fri |
EEEE |
星期全称 (Monday, Tuesday…) | Friday |
| 小时 (Hour) | ||
H, k |
24小时制 (0-23或1-24) | 14 |
HH, kk |
24小时制,两位,不足补零 | 14 |
K |
12小时制 (0-11) | 2 (代表下午2点) |
KK |
12小时制,两位 (00-11) | 02 |
h |
12小时制 (1-12) | 2 |
hh |
12小时制,两位 (01-12) | 02 |
| 分钟 (Minute) | ||
m, mm |
分钟 (0-59),mm带前导零 | 5 或 05 |
| 秒 (Second) | ||
s, ss |
秒 (0-59),ss带前导零 | 7 或 07 |
SSS |
三位毫秒 (000-999),不足补零 | 123 |
| AM/PM | ||
a |
上午/下午标记 (AM/PM) | PM |
| 时区 (Timezone) | ||
z |
时区缩写名称 | UTC |
zzzz |
时区完整名称 | Coordinated Universal Time |
Z, X |
时区偏移量 | +0000 或 Z |
注意:这些模式字母不仅适用于str.format(),也同样适用于我们后面要讲的str.format_time()函数。如果想在模板里显示字母本身(比如字母’H’),需要用单引号' '把它括起来转义。
常用模式字母组合示例
认识了零件,我们来看看一些常用的设计蓝图(组合方式),这能帮你快速上手:
| 模式字母模板 | 说明 | 示例输出 (假设时间为下午2:05:07) |
K:mm a |
12小时制小时,带前导零的分钟,AM/PM标记。 | 2:05 PM |
HH:mm |
24小时制小时(不足两位补零),带前导零的分钟。 | 14:05 |
HH:mm:ss |
24小时制小时,分钟,秒(均带前导零)。 | 14:05:07 |
HH:mm:ss.SSS |
在上一条基础上,增加三位毫秒。 | 14:05:07.123 |
M/d/yy |
美式短日期:月/日/两位年。 | 6/5/25 (假设2025年6月5日) |
yyyy-MM-dd |
中式常用日期:四位年-两位月-两位日。 | 2025-06-05 |
实战案例:综合运用模式字母创建信息标签
下面的指标脚本演示了如何在实际应用中,通过str.format()的模式字母,将K线的开盘时间格式化为日内时间和日期,并将这些信息与品种代码、K线范围(以tick为单位)一同显示在图表的最后一个K线的标签上。
//@version=6
indicator(title="str.format() 模式字母示例", overlay=true)
if barstate.islast
// 1. 计算当前K线的波幅
tickRange = (high - low) / syminfo.mintick
// 2. 使用str.format()和模式字母
labelText = str.format(
// 模板字符串,用 n 换行
"{0}n时间: {1,time,H:mm:ss}n日期: {1,date,E d-M-yy}n" +
"波幅: {2,number} ticks",
// --- 下方是按顺序填充的参数列表 ---
syminfo.ticker, // -> {0}: 品种代码
time, // -> {1}: K线开盘时间
tickRange // -> {2}: K线波幅
)
// 3. 创建标签
label.new(bar_index + 1, hl2, text=labelText,
style=label.style_label_left, color=color.new(color.teal, 10),
textcolor=color.white, size=size.large)
最终,图表上的标签会清晰地展示经过精确格式化的时间、日期以及K线波幅信息:
总结
总结一下,模式字母是str.format()函数在处理时间格式化时的终极武器。它让你彻底摆脱预设格式的束缚,可以随心所欲地创造出任何符合你需求、符合你阅读习惯的日期时间文本。模式字母需要放置在占位符中,并且位于time或date这类预定义格式说明符之后(例如 {0,time,HH:mm})。当你需要在标签或警报中,以一种高度自定义的方式展示时间时,模式字母就是你的不二之选。



