You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Ignite REST API时间戳格式配置咨询(版本升级后格式变更)

问题解答

可以通过配置Ignite的自定义时间戳格式化器来统一REST API的时间输出格式,解决版本升级后格式变化的问题。

问题原因

Ignite 2.7.6(Java 8)与2.13(Java 11)之间,时间戳格式化逻辑出现差异:要么是Java版本升级后SimpleDateFormat/DateTimeFormatter的本地化默认行为改变,要么是Ignite自身在新版本中调整了默认的时间格式化实现,最终导致年份后多了一个逗号。

解决方法

1. 自定义时间戳格式化器

实现Ignite的TimestampFormatter接口,强制指定你需要的格式(比如MMM dd, yyyy hh:mm:ss a,对应旧版本的输出样式),然后在Ignite配置中注册这个自定义类。

自定义格式化器代码示例:

import org.apache.ignite.internal.processors.rest.protocols.http.jetty.TimestampFormatter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class CustomRestTimestampFormatter implements TimestampFormatter {
    // 匹配Ignite 2.7.6的时间格式
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss a", Locale.US);

    @Override
    public String format(long timestamp) {
        // SimpleDateFormat非线程安全,需同步处理
        synchronized (DATE_FORMAT) {
            return DATE_FORMAT.format(new Date(timestamp));
        }
    }
}

在Ignite配置中注册:

  • XML配置方式:
<bean class="org.apache.ignite.configuration.IgniteConfiguration">
    <!-- 其他配置项 -->
    <property name="timestampFormatter">
        <bean class="com.your.package.CustomRestTimestampFormatter"/>
    </property>
</bean>
  • Java代码配置方式:
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.Ignition;

public class IgniteStartup {
    public static void main(String[] args) {
        IgniteConfiguration cfg = new IgniteConfiguration();
        cfg.setTimestampFormatter(new CustomRestTimestampFormatter());
        Ignition.start(cfg);
    }
}

2. 系统属性配置(部分版本支持)

如果不想编写自定义类,可以尝试通过启动参数指定时间格式(需确认Ignite 2.13是否支持该属性):

# 启动Ignite时添加JVM参数
-Dignite.rest.timestamp.format="MMM dd, yyyy hh:mm:ss a"

注意事项

  • 自定义格式化器时,注意SimpleDateFormat的线程安全性问题,建议使用同步块或者线程安全的DateTimeFormatter(Java 8+推荐)。
  • 如果使用DateTimeFormatter,可以替换示例中的SimpleDateFormat为:
private static final DateTimeFormatter FORMAT = DateTimeFormatter.ofPattern("MMM dd, yyyy hh:mm:ss a", Locale.US);

@Override
public String format(long timestamp) {
    return FORMAT.format(Instant.ofEpochMilli(timestamp).atZone(ZoneId.systemDefault()).toLocalDateTime());
}

内容的提问来源于stack exchange,提问作者Dren Butković

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:40:48