2026-04-27 21:10:27 +08:00

69 lines
1.8 KiB
Go

package invite
import (
"strings"
"time"
)
// defaultIfBlank 在字符串为空时返回默认值。
func defaultIfBlank(value, fallback string) string {
if strings.TrimSpace(value) == "" {
return fallback
}
return value
}
// normalizeSysOrigin 统一系统标识格式。
func normalizeSysOrigin(value string) string {
return strings.TrimSpace(value)
}
// normalizeTimezone 统一时区配置,缺省回退到默认时区。
func normalizeTimezone(value string) string {
value = strings.TrimSpace(value)
if value == "" {
return defaultTimezone
}
return value
}
func inviteLocation(timezone string) *time.Location {
location, err := time.LoadLocation(normalizeTimezone(timezone))
if err != nil {
location = time.FixedZone(defaultTimezone, 3*3600)
}
return location
}
// calendarMonthPeriodInfoAt 返回指定时间所在自然月任务周期的 key、结束时间、剩余秒数和周期天数。
func calendarMonthPeriodInfoAt(t time.Time, timezone string) (string, time.Time, int64, int) {
location := inviteLocation(timezone)
localTime := t.In(location)
periodStart := time.Date(localTime.Year(), localTime.Month(), 1, 0, 0, 0, 0, location)
periodEnd := periodStart.AddDate(0, 1, 0)
seconds := int64(periodEnd.Sub(localTime).Seconds())
if seconds < 0 {
seconds = 0
}
periodDays := int(periodEnd.Sub(periodStart) / (24 * time.Hour))
return periodStart.Format("200601"), periodEnd, seconds, periodDays
}
// digitsOnly 判断字符串是否只包含数字。
func digitsOnly(value string) bool {
for _, ch := range value {
if ch < '0' || ch > '9' {
return false
}
}
return true
}
// truncate 截断字符串,避免超出数据库字段长度。
func truncate(value string, size int) string {
if len(value) <= size {
return value
}
return value[:size]
}