excel/wps手动转换数据格式再加减法,excel/wps写公式/vba,bat/powershell/python/matlab等写处理脚本,AI/本地模型,都是可行的。
这事儿很简单,办法很多,建议传个附件/复制一段有特征的文本,去除隐私信息。楼上每个人应该都有解决方案,但没有示例求助就没有意义。
实在不行,上面每个方法都可以去查一下,研究怎么做。
给一个简单的powershell示例,如果是windows电脑,能不装软件直接用(搜一下怎么用Powershell ISE):
# =================数据区域=================
$inputData = @"
2025-01-27 16:38:51 2025-01-27 12:39:27 2025-01-27 11:32:01 2025-01-27 06:40:45
2026/1/24 22:12:40 2026/1/24 6:39:37
2025-02-02 18:00:00 2025-02-02 09:00:00 2025-02-02 12:00:00
"@
# =========================================
$pattern = "\d{4}[-/]\d{1,2}[-/]\d{1,2}\s+\d{1,2}:\d{2}:\d{2}"
$results = @()
# 按行读取数据
$inputData -split "`n" | ForEach-Object {
$line = $_.Trim()
# 1. 在当前行中提取所有看起来像时间的内容
$matches = [regex]::Matches($line, $pattern)
if ($matches.Count -ge 2) {
# 2. 将文本转为时间对象,并从小到大排序
# 即使原始数据是乱序的 (如下午在上午前面),排序后第一个就是上班,最后一个就是下班
$times = $matches | ForEach-Object { [DateTime]$_.Value } | Sort-Object
$startTime = $times[0] # 最早时间
$endTime = $times[$times.Count - 1] # 最晚时间
# 3. 计算时间差
$duration = $endTime - $startTime
# 4. 生成结果对象
$results += [PSCustomObject]@{
日期 = $startTime.ToString("yyyy-MM-dd")
星期 = $startTime.DayOfWeek
上班时间 = $startTime.ToString("HH:mm:ss")
下班时间 = $endTime.ToString("HH:mm:ss")
总工时 = "{0}小时 {1}分钟" -f [math]::Floor($duration.TotalHours), $duration.Minutes
原始工时 = $duration.ToString() # 方便核对
打卡次数 = $times.Count
}
}
}
# =================输出区域=================
# 将结果直接弹窗显示表格,支持复制到 Excel
$results | Out-GridView -Title "考勤计算结果 (Ctrl+A 全选可复制到 Excel)"
# 如果你想直接在控制台看,取消下面这行的注释
# $results | Format-Table -AutoSize
|