package com.seeyon.apps.src_flowIntegration.util;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class TimestampConverter {
    // 定义全局的格式化器（线程安全，可复用）
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    // 采用系统默认时区，也可指定如 ZoneId.of("Asia/Shanghai")
    private static final ZoneId DEFAULT_ZONE = ZoneId.systemDefault();

    /**
     * long时间戳转 yyyy-MM-dd 格式
     * @param timestamp 毫秒级时间戳（long类型）
     * @return 日期字符串，如 2026-02-26
     */
    public static String longToDateStr(long timestamp) {
        // 将long时间戳转为Instant，再转为指定时区的LocalDateTime，最后格式化
        LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), DEFAULT_ZONE);
        return localDateTime.format(DATE_FORMATTER);
    }

    /**
     * long时间戳转 yyyy-MM-dd HH:mm:ss 格式
     * @param timestamp 毫秒级时间戳（long类型）
     * @return 日期时间字符串，如 2026-02-26 10:50:30
     */
    public static String longToDateTimeStr(long timestamp) {
        LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), DEFAULT_ZONE);
        return localDateTime.format(DATETIME_FORMATTER);
    }

    /**
     * 将long型毫秒时间戳转换为yyyy-MM-dd HH:mm:ss格式字符串
     * @param timestamp 毫秒级时间戳（long类型）
     * @return 格式化后的时间字符串
     */
    public static String timestampToDateTime(long timestamp) {
        // 1. 时间戳转Instant
        Instant instant = Instant.ofEpochMilli(timestamp);
        // 2. Instant转带时区的ZonedDateTime
        ZonedDateTime zonedDateTime = instant.atZone(DEFAULT_ZONE);
        // 3. 格式化输出
        return zonedDateTime.format(DATETIME_FORMATTER);
    }

    /**
     * 处理秒级时间戳的重载方法
     * @param timestamp 秒级时间戳
     * @return 格式化后的时间字符串
     */
    public static String timestampToDateTimeFromSecond(long timestamp) {
        Instant instant = Instant.ofEpochSecond(timestamp);
        ZonedDateTime zonedDateTime = instant.atZone(DEFAULT_ZONE);
        return zonedDateTime.format(DATETIME_FORMATTER);
    }

    public static void main(String[] args) {
        // 测试1：毫秒级时间戳（最常用）
        long msTimestamp = 1735689600000L; // 对应2025-01-01 08:00:00
        System.out.println("毫秒级转换结果：" + timestampToDateTime(msTimestamp));

        // 测试2：秒级时间戳
        long sTimestamp = 1735689600L;
        System.out.println("秒级转换结果：" + timestampToDateTimeFromSecond(sTimestamp));
    }
}