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

如何将C# DateTime转换为Java DateTime?附代码转换需求

嘿,刚接触Java就碰到日期转换的坑太正常了,我来帮你把这段C#代码转成靠谱的Java实现,顺便解决你遇到的「整数过大」问题~

首先先拆解下你那段C#代码的核心逻辑:

  • 以1970年1月1日UTC为起点,把传入的毫秒数转成本地时间
  • 判断这个日期是否在最近一周内(今天往前推6天)
  • 如果是:当天返回"Today",同周其他天返回星期几名称
  • 不在最近一周的话,就返回dd-MM-yyyy格式的日期

推荐方案:用Java 8+的java.time API(官方推荐)

老旧的Calendar API不仅难用,还容易踩坑,Java 8之后引入的java.time包(JSR-310)是官方主推的日期时间处理方案,代码简洁还线程安全,完美匹配C#里的日期逻辑:

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;

public class DateHandler {
    private String getDate(Object value) {
        // 对应C#的DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
        Instant epochStart = Instant.EPOCH;
        // 把毫秒数转成本地时区的日期时间
        ZonedDateTime targetDate = epochStart.plusMillis((long) value)
                                             .atZone(ZoneId.systemDefault());
        
        // 计算最近一周的起始日期(今天往前推6天)
        LocalDate lastWeek = LocalDate.now().minusDays(6);
        
        if (targetDate.toLocalDate().isAfter(lastWeek) || targetDate.toLocalDate().isEqual(lastWeek)) {
            LocalDate today = LocalDate.now();
            if (targetDate.toLocalDate().isEqual(today)) {
                return "Today";
            } else {
                // 获取本地化的星期名称,比如英文环境返回"Monday",和C#逻辑一致
                // 如果需要严格匹配C#的首字母大写格式,也可以手动处理:
                // String dayName = targetDate.getDayOfWeek().name();
                // return dayName.substring(0, 1) + dayName.substring(1).toLowerCase();
                return targetDate.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.getDefault());
            }
        } else {
            // 格式化日期为dd-MM-yyyy
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
            return targetDate.format(formatter);
        }
    }
}

关键点说明:

  1. 解决「整数过大」问题:这里强制把value转成long类型,因为Java的int最大值只有2147483647,而你传入的毫秒数(比如1406205185123)远超过这个范围,转成long就不会溢出了。
  2. 时区处理:atZone(ZoneId.systemDefault())对应C#的ToLocalTime(),自动适配当前系统的时区。
  3. 日期比较:用LocalDate只处理日期部分,避免时分秒干扰判断逻辑,比Calendar直观太多。

兼容旧Java版本(8以下):用Calendar的修正方案

如果你的项目只能用Java 8之前的版本,那也可以修正Calendar的代码,核心就是避免int溢出和正确处理日期比较:

import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.util.Locale;

public class LegacyDateHandler {
    private String getDate(Object value) {
        // 初始化1970-01-01 UTC起点
        Calendar epochStart = Calendar.getInstance();
        epochStart.set(1970, Calendar.JANUARY, 1, 0, 0, 0);
        epochStart.set(Calendar.MILLISECOND, 0);
        
        // 必须转成long!否则超大毫秒数会溢出int范围
        long totalMillis = epochStart.getTimeInMillis() + (long) value;
        
        Calendar targetCal = Calendar.getInstance();
        targetCal.setTimeInMillis(totalMillis);
        
        // 计算最近一周的起始日期(清零时间部分,只比日期)
        Calendar lastWeekCal = Calendar.getInstance();
        lastWeekCal.add(Calendar.DAY_OF_YEAR, -6);
        clearTimePart(lastWeekCal);
        
        // 今天的日期(清零时间部分)
        Calendar todayCal = Calendar.getInstance();
        clearTimePart(todayCal);
        
        if (targetCal.after(lastWeekCal) || targetCal.equals(lastWeekCal)) {
            if (targetCal.equals(todayCal)) {
                return "Today";
            } else {
                // 获取本地化的星期名称
                return targetCal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault());
            }
        } else {
            SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
            return formatter.format(targetCal.getTime());
        }
    }
    
    // 辅助方法:清零Calendar的时分秒毫秒部分
    private void clearTimePart(Calendar cal) {
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
    }
}

旧版本注意点:

  • 一定要把value强制转成long,这是解决你「整数过大」错误的核心!
  • 比较日期前要清零时间部分,否则会因为时分秒不同导致判断错误。
  • SimpleDateFormat不是线程安全的,如果在多线程环境使用,建议每次创建新实例或者用ThreadLocal包装。

内容的提问来源于stack exchange,提问作者Dishant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:31:26