传入一个时间,返回和当前的时间差

本文介绍了一种从特定格式的时间字符串中解析并计算出与当前时间差异的方法,该方法能够根据时间差的大小自动选择合适的单位(分钟、小时、天或月)进行表示。

调用方式:
TBuf<128> bSour;
TBuf<128> bDesc;
bSour.Append(_L("2011-05-22T21:50:15+08:00"));
ConvData(bSour, bDesc);
iEikonEnv->InfoWinL(bDesc, KNullDesC);




//传入一个时间,然后计算出时间差,用分钟表示,大于60分钟就用小时表示,大于24小时,就用天表示,大于24天,就用月表示
//aSource :传入格式:2011-05-18T20:54:15+08:00
//aDesc :传出数据,如果为空,表示传入的时间大于当前时间
void CWorldView::ConvData(const TDesC & aSource, TDes & aDesc)
    {
    //如果小于18位,也就是传过来的时间字符串有误
    if (18 > aSource.Length())
        return;

    TInt nYear;
    TInt nMonth;
    TInt nDay;

    TLex iLex;
    //年
    iLex = aSource.Mid(0, 4);
    iLex.Val(nYear);
    //月
    iLex = aSource.Mid(5, 2);
    iLex.Val(nMonth);
    //日
    iLex = aSource.Mid(8, 2);
    iLex.Val(nDay);

    TInt nHour = 0;
    TInt nMinute = 0;

    //计算小时
    iLex = aSource.Mid(11, 2);
    iLex.Val(nHour);

    //计算分钟
    iLex = aSource.Mid(14, 2);
    iLex.Val(nMinute);

    TDateTime time;
    time.SetYear(nYear);
    time.SetMonth(TMonth(EJanuary + nMonth - 1));
    time.SetDay(nDay - 1);
    time.SetHour(nHour);
    time.SetMinute(nMinute);

    TTime tCur;
    tCur.HomeTime();

    TTime tFirst;
    tFirst = time;

    //计算月数
    TInt nValue = tCur.MonthsFrom(tFirst).Int();

    //时间错误
    if (0 > nValue)
        {
        return;
        }

    //月份大于大当前月份
    if (0 < nValue)
        {
        aDesc.AppendNum(nValue);
        aDesc.Append(_L(" month"));
        return;
        }

    //计算天数
    nValue = tCur.DaysFrom(tFirst).Int();

    //天数大于当前天数
    if (0 > nValue)
        {
        return;
        }

    //够一天
    if (0 < nValue)
        {
        aDesc.AppendNum(nValue);
        aDesc.Append(_L(" day"));
        return;
        }

    //小时
    TTimeIntervalHours hours;
    tCur.HoursFrom(tFirst, hours);
    nValue = hours.Int();

    //时间错误
    if (0 > nValue)
        {
        return;
        }

    //够一个小时
    if (0 < nValue)
        {
        aDesc.AppendNum(nValue);
        aDesc.Append(_L(" hours"));
        return;
        }

    //分钟
    TTimeIntervalMinutes minutes;
    tCur.MinutesFrom(tFirst, minutes);
    nValue = minutes.Int();

    //分钟错误
    if (0 > nValue)
        {
        return;
        }

    aDesc.AppendNum(nValue);
    aDesc.Append(_L(" minutes"));
    return;
    }

如果需要在 **时间格式不匹配时直接返回 `0`**,可以通过捕获解析异常来实现。以下是优化后的代码(以 Java 为例): --- ### 1. **Java 实现(带格式校验)** ```java import java.time.*; import java.time.format.*; import java.time.temporal.*; public class TimeDiffCalculator { public static long calculateHoursDiff(String dateTimeStr) { try { // 定义格式(严格匹配 "yyyy-MM-dd HH:mm:ss.SSS") DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); // 解析为 LocalDateTime,再转为 Instant(假设输入是 UTC) LocalDateTime localDateTime = LocalDateTime.parse(dateTimeStr, formatter); Instant target = localDateTime.atZone(ZoneOffset.UTC).toInstant(); // 计算与当前时间的小时间隔(绝对值) return Math.abs(ChronoUnit.HOURS.between(Instant.now(), target)); } catch (DateTimeParseException e) { // 格式不匹配时捕获异常并返回 0 return 0; } } public static void main(String[] args) { String[] testCases = { "2025-02-28 12:30:45.500", // 正确格式 "2025/02/28 12:30:45", // 错误分隔符 "2025-02-28T12:30:45Z", // 错误格式(含时区) "Invalid Date" // 完全无效 }; for (String testCase : testCases) { System.out.println("输入: " + testCase + " | 间隔小时数: " + calculateHoursDiff(testCase)); } } } ``` #### 输出示例: ``` 输入: 2025-02-28 12:30:45.500 | 间隔小时数: 12420 输入: 2025/02/28 12:30:45 | 间隔小时数: 0 输入: 2025-02-28T12:30:45Z | 间隔小时数: 0 输入: Invalid Date | 间隔小时数: 0 ``` --- ### 2. **关键改进点** 1. **异常捕获** 通过 `try-catch` 捕获 `DateTimeParseException`,格式错误时直接返回 `0`。 2. **格式严格性** - 模式 `yyyy-MM-dd HH:mm:ss.SSS` 必须完全匹配(包括毫秒空格)。 - 如果输入可能缺少毫秒,需调整模式(如 `yyyy-MM-dd HH:mm:ss`)并分情况处理。 3. **时区明确性** 假设输入时间是 UTC,若实际为本地时间,需在解析时指定时区(如 `Asia/Shanghai`)。 --- ### 3. **Python 实现(带格式校验)** ```python from datetime import datetime, timezone def calculate_hours_diff(date_time_str): try: # 尝试解析格式(支持带/不带毫秒) dt = datetime.strptime(date_time_str, "%Y-%m-%d %H:%M:%S.%f") except ValueError: try: dt = datetime.strptime(date_time_str, "%Y-%m-%d %H:%M:%S") except ValueError: return 0 # 所有格式均不匹配时返回 0 # 计算时间差(绝对值) diff = datetime.now(timezone.utc) - dt.replace(tzinfo=timezone.utc) return abs(int(diff.total_seconds() / 3600)) # 测试 test_cases = [ "2025-02-28 12:30:45.500", "2025-02-28 12:30:45", "2025/02/28 12:30:45", "Invalid Date" ] for case in test_cases: print(f"输入: {case} | 间隔小时数: {calculate_hours_diff(case)}") ``` #### 输出示例: ``` 输入: 2025-02-28 12:30:45.500 | 间隔小时数: 12420 输入: 2025-02-28 12:30:45 | 间隔小时数: 12420 输入: 2025/02/28 12:30:45 | 间隔小时数: 0 输入: Invalid Date | 间隔小时数: 0 ``` --- ### 4. **适用场景** - **严格模式**:仅接受完全匹配的格式(如必须含毫秒)。 - **宽松模式**:允许部分格式变体(如无毫秒),需多次尝试解析(如 Python 示例)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值