技术频道


各语言计算日期差

Go


注意:在 Go 语言中,时间的格式化字符串是固定的,采用的是一个特定的时间:2006年1月2日15时04分05秒(Mon Jan 2 15:04:05 MST 2006)。这个时间点被选为参考点,主要是因为它相对容易记忆 2006 之后:1-2-3-4-5,且包含了各种时间单位,可以方便地用于格式化和解析时间。在Go中,使用这种参考时间的风格是推荐的。

package main

import (
  "fmt"
  "time"
)

func calculateDateDifference(date1, date2 string) (int, error) {
  // 定义日期格式
  layout := "2006-01-02"

  // 将日期字符串解析为Time对象
  parsedDate1, err := time.Parse(layout, date1)
  if err != nil {
    return 0, err
  }

  parsedDate2, err := time.Parse(layout, date2)
  if err != nil {
    return 0, err
  }

  // 计算日期差
  daysDifference := int(parsedDate2.Sub(parsedDate1).Hours() / 24)

  return daysDifference, nil
}

func main() {
  // 示例用法
  date1 := "2023-12-12"
  date2 := "2023-12-15"

  daysDifference, err := calculateDateDifference(date1, date2)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Printf("Days difference between %s and %s: %d days\n", date1, date2, daysDifference)
}

在 time 包中,日期格式化的模板字符串中的年、月、日等部分,使用的是参考时间的对应部分。例如:

  • 2006表示年份
  • 01表示月份
  • 02表示日期
  • 15表示小时(24小时制)
  • 04表示分钟
  • 05表示秒

Java


import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class DateDifferenceCalculator {

    public static long calculateDateDifference(String date1, String date2) {
        try {
            // 定义日期格式
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

            // 将日期字符串解析为LocalDate对象
            LocalDate localDate1 = LocalDate.parse(date1, formatter);
            LocalDate localDate2 = LocalDate.parse(date2, formatter);

            // 计算日期差
            long daysDifference = ChronoUnit.DAYS.between(localDate1, localDate2);

            return Math.abs(daysDifference);
        } catch (Exception e) {
            // 处理日期解析错误
            e.printStackTrace();
            return -1; // 或者抛出异常,具体取决于你的需求
        }
    }

    public static void main(String[] args) {
        // 示例用法
        String date1 = "2023-01-01";
        String date2 = "2023-12-31";

        long daysDifference = calculateDateDifference(date1, date2);
        System.out.println("Days difference between " + date1 + " and " + date2 + ": " + daysDifference + " days");
    }
}

Python


from datetime import datetime

def calculate_date_difference(date1, date2):
    # 将日期字符串转换为 datetime 对象
    try:
        date1 = datetime.strptime(date1, "%Y-%m-%d")
        date2 = datetime.strptime(date2, "%Y-%m-%d")
    except ValueError:
        # 处理日期转换错误
        return "Invalid date format"

    # 计算日期差
    difference = abs((date2 - date1).days)

    return difference

# 示例用法
date1 = "2023-12-12"
date2 = "2023-12-15"

days_difference = calculate_date_difference(date1, date2)
print(f"Days difference between {date1} and {date2}: {days_difference} days")

# 返回:Days difference between 2023-12-12 and 2023-12-15: 3 days

JavaScript


// 支持返回负数
function calc_days($date1, $date2) {
    $datetime1 = new DateTime($date1);
    $datetime2 = new DateTime($date2);

    // 获取日期间隔
    $interval = $datetime1->diff($datetime2);

    // 检查日期的顺序并调整结果
    $days = $interval->days;
    if ($datetime1 > $datetime2) {
        $days = -$days;
    }

    return $days;
}

// 示例
$date1 = '2023-11-15';
$date2 = '2023-11-14';
echo calc_days($date1, $date2); // 输出 -1


// #####################################################


// 只返回天数(不考虑负数)
function calc_days($date1, $date2) {
    $datetime1 = new DateTime($date1);
    $datetime2 = new DateTime($date2);
    
    // 确保日期1较早
    if ($datetime1 > $datetime2) {
        $temp = $datetime1;
        $datetime1 = $datetime2;
        $datetime2 = $temp;
    }

    $interval = $datetime1->diff($datetime2);
  
    return $interval->days;
}

// 示例
$date1 = '2023-11-14';
$date2 = '2023-11-15';
echo calc_days($date1, $date2); // 输出 1

SQL


SELECT DATEDIFF('2023-12-12', '2023-12-15') AS DateDifference;

-- 返回 -3

PHP


<?php
function calculateDateDifference($date1, $date2) {
    // 将日期字符串转换为 Unix 时间戳
    $timestamp1 = strtotime($date1);
    $timestamp2 = strtotime($date2);

    if ($timestamp1 === false || $timestamp2 === false) {
        // 处理日期转换错误
        return "Invalid date format";
    } else {
        // 计算时间差(秒数)
        $difference = abs($timestamp2 - $timestamp1);

        // 将秒数转换为天数
        $days = floor($difference / (60 * 60 * 24));

        return $days;
    }
}

// 示例用法
$date1 = "2023-12-12";
$date2 = "2023-12-15";

$daysDifference = calculateDateDifference($date1, $date2);
echo "Days difference between $date1 and $date2 => $daysDifference days";


// 返回:Days difference between 2023-12-12 and 2023-12-15 => 3 days

Delphi / Pascal


在 Delphi 中,可以使用 TDateTime 类型和 DateUtils 单元来计算两个日期之间的天数差。以下是一个 Delphi 的例子:

unit DateDifferenceUnit;

interface

uses
  SysUtils, DateUtils;

function CalculateDateDifference(const date1, date2: string): Integer;

implementation

function CalculateDateDifference(const date1, date2: string): Integer;
var
  dateTime1, dateTime2: TDateTime;
begin
  // 将日期字符串转换为TDateTime类型
  try
    dateTime1 := StrToDate(date1);
    dateTime2 := StrToDate(date2);
  except
    // 处理日期转换错误
    raise Exception.Create('Invalid date format');
  end;

  // 计算日期差
  Result := DaysBetween(dateTime2, dateTime1);
end;

end.

这个例子中,使用了StrToDate函数将日期字符串转换为TDateTime类型,然后使用DaysBetween函数计算两个日期之间的天数差。如果日期格式无效,函数会抛出一个异常。

在主程序中调用这个函数:

program DateDifferenceProgram;

uses
  DateDifferenceUnit;

var
  date1, date2: string;
  daysDifference: Integer;

begin
  // 示例用法
  date1 := '2023-01-01';
  date2 := '2023-12-31';

  try
    daysDifference := CalculateDateDifference(date1, date2);
    Writeln('Days difference between ', date1, ' and ', date2, ': ', daysDifference, ' days');
  except
    on E: Exception do
      Writeln('Error: ', E.Message);
  end;
end.

Bash


#!/bin/bash

# 函数:计算两个日期之间的天数差
calculate_date_difference() {
    # 将日期字符串转换为时间戳
    date1=$(date -d "$1" +%s)
    date2=$(date -d "$2" +%s)

    # 计算日期差(以秒为单位)
    difference=$((date2 - date1))

    # 将秒数转换为天数
    days=$((difference / 86400))  # 1天 = 24小时 * 60分钟 * 60秒

    echo $days
}

# 示例用法
date1="2023-01-01"
date2="2023-12-31"

days_difference=$(calculate_date_difference "$date1" "$date2")
echo "Days difference between $date1 and $date2: $days_difference days"

VBScript


Option Explicit

' 函数:计算两个日期之间的天数差
Function CalculateDateDifference(date1, date2)
    Dim date1Obj, date2Obj, daysDifference
    ' 将日期字符串转换为日期对象
    Set date1Obj = CDate(date1)
    Set date2Obj = CDate(date2)
    
    ' 使用 DateDiff 函数计算天数差
    daysDifference = DateDiff("d", date1Obj, date2Obj)
    
    CalculateDateDifference = Abs(daysDifference)
End Function

' 示例用法
Dim date1, date2, daysDifference
date1 = "2023-01-01"
date2 = "2023-12-31"

daysDifference = CalculateDateDifference(date1, date2)
WScript.Echo "Days difference between " & date1 & " and " & date2 & ": " & daysDifference & " days"

计算日期差扩展阅读:



发表评论