I have finally solved this. After putting the problem aside for a year, I used ChatGPT and got a great easy solution that fixed all the date problems created when downloading pictures from an iphone to a windows computer; something I discovered is common. I've copied all the Chat GPT instructions here if anyone else is having this problem and wants a step by step fix with all the code written out for them to copy. I even included my follow on questions and the answers for those who are like me and not tech savvy.Ā Ā
I hope this helps.
On Windows, when you copy photos from your iPhone, the **Date Created** field is often reset to the time of the transfer, while **Date Modified** usually keeps the actual ātakenā time. Unfortunately, Windows doesnāt have a built-in way to edit the *Date Created* field directly, but there are reliable workarounds:
---
### ā
Option 1: Use Windows PowerShell
1. Open **PowerShell** (search for it in the Start menu).
2. Navigate to the folder containing your photos:
Ā Ā ```powershell
Ā Ā cd "C:\path\to\your\photos"
Ā Ā ```
3. Run this command (this will copy the Date Modified value into Date Created for all `.jpg` files in the folder):
Ā Ā ```powershell
Ā Ā Get-ChildItem *.jpg | ForEach-Object {
Ā Ā Ā Ā $_.CreationTime = $_.LastWriteTime
Ā Ā }
Ā Ā ```
Ā Ā * `CreationTime` = Date Created
Ā Ā * `LastWriteTime` = Date Modified
Ā Ā This will set **Date Created = Date Modified**.
---
### ā
Option 2: Use a Free Tool
If you prefer a graphical interface, there are free tools that can batch-edit metadata:
* **ExifTool** (powerful, but command-line based)
* **Attribute Changer** (adds a right-click menu in Windows Explorer)
With these, you can manually or batch-set Date Created to match Date Modified.
---
### ā
Option 3: Use the Photoās EXIF Metadata
Your iPhone embeds the *true taken date* in the EXIF data inside the file. You can:
* Right-click a photo ā **Properties ā Details tab** to confirm the āDate taken.ā
* If needed, use **ExifTool** to overwrite Windows āDate Createdā with the EXIF Date Taken.
---
š Do you want me to give you a ready-to-use **PowerShell script** that you can just drop into your photo folder to automatically fix all the timestamps?
Awesome ā hereās a ready-to-use PowerShell script that sets **Date Created** to match **Date Modified** for common photo/video types. It also makes a backup log so you can undo if needed, and it supports a preview mode.
### 1) Save this as `Fix-CreationTime.ps1`
```powershell
<#
.SYNOPSIS
Ā Set "Date Created" (CreationTime) to match "Date Modified" (LastWriteTime)
Ā for common photo/video files. Creates a CSV backup log first.
.PARAMETER Path
Ā Folder to process. Default = current folder (.)
.PARAMETER Recurse
Ā Include all subfolders.
.PARAMETER Preview
Ā Show what would change, but don't modify anything.
.PARAMETER Extensions
Ā File extensions to include. Default covers common image/video types.
.PARAMETER Log
Ā Path to the CSV backup log. Default = TimestampBackup_yyyyMMdd_HHmmss.csv
#>
param(
Ā [string]$Path = ".",
Ā [switch]$Recurse,
Ā [switch]$Preview,
Ā [string[]]$Extensions = @(".jpg",".jpeg",".png",".heic",".dng",".tif",".tiff",".gif",
Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā ".mp4",".mov",".avi",".mts",".m2ts",".wmv",".mkv"),
Ā [string]$Log = ("TimestampBackup_{0}.csv" -f (Get-Date -Format "yyyyMMdd_HHmmss"))
)
# Resolve path and gather files
$resolved = Resolve-Path -Path $Path -ErrorAction Stop
$searchParams = @{
Ā Path Ā = $resolved
Ā File Ā = $true
}
if ($Recurse) { $searchParams.Recurse = $true }
$all = Get-ChildItem @searchParams | Where-Object {
Ā $Extensions -contains ([System.IO.Path]::GetExtension($_.FullName).ToLower())
}
if (-not $all) {
Ā Write-Host "No matching files found in $resolved" -ForegroundColor Yellow
Ā return
}
# Backup current timestamps
$backup = $all | Select-Object `
Ā @{n='FullName';e={$_.FullName}},
Ā @{n='CreationTime';e={$_.CreationTime}},
Ā @{n='CreationTimeUtc';e={$_.CreationTimeUtc}},
Ā @{n='LastWriteTime';e={$_.LastWriteTime}},
Ā @{n='LastWriteTimeUtc';e={$_.LastWriteTimeUtc}}
$backup | Export-Csv -Path $Log -NoTypeInformation -Encoding UTF8
Write-Host "Backup log saved to: $Log" -ForegroundColor Cyan
# Do the work (or preview it)
$changed = 0
$errors Ā = 0
foreach ($f in $all) {
Ā try {
Ā Ā $fromLocal = $f.CreationTime
Ā Ā $toLocal Ā = $f.LastWriteTime
Ā Ā if ($Preview) {
Ā Ā Ā Write-Host "[PREVIEW] $($f.Name)" -NoNewline
Ā Ā Ā Write-Host " Ā CreationTime: $fromLocal Ā -> Ā $toLocal"
Ā Ā Ā continue
Ā Ā }
Ā Ā # Set both local and UTC to avoid timezone quirks
Ā Ā $f.CreationTimeUtc = $f.LastWriteTimeUtc
Ā Ā $f.CreationTime Ā Ā = $f.LastWriteTime
Ā Ā $changed++
Ā }
Ā catch {
Ā Ā $errors++
Ā Ā Write-Warning ("Failed to update: {0} Ā ({1})" -f $f.FullName, $_.Exception.Message)
Ā }
}
if ($Preview) {
Ā Write-Host "`nPreview complete. No files changed." -ForegroundColor Yellow
} else {
Ā Write-Host "`nDone. Files updated: $changed Ā | Ā Errors: $errors" -ForegroundColor Green
Ā Write-Host "If you need to undo, use the CSV log ($Log) to restore times." -ForegroundColor DarkGray
}
```
### 2) Run it
1. Right-click **Start** ā **Windows PowerShell (Admin)** (or **Terminal (Admin)**).
2. Navigate to your photo folder, e.g.:
Ā Ā ```powershell
Ā Ā cd "C:\Users\YourName\Pictures\iPhone Imports"
Ā Ā ```
3. **Preview** the changes first (no files modified):
Ā Ā ```powershell
Ā Ā .\Fix-CreationTime.ps1 -Preview
Ā Ā ```
4. **Apply** the changes in the current folder:
Ā Ā ```powershell
Ā Ā .\Fix-CreationTime.ps1
Ā Ā ```
5. Include **subfolders**:
Ā Ā ```powershell
Ā Ā .\Fix-CreationTime.ps1 -Recurse
Ā Ā ```
> If you get an execution policy warning, run this once in the same admin PowerShell window:
>
> ```powershell
> Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
> ```
>
> (Choose **Y** when prompted.)
### Notes & tips
* This script sets **Date Created** to exactly equal **Date Modified** for each file.
* It logs original timestamps to a CSV (`TimestampBackup_ā¦csv`) so you have a record.
* If a file is **read-only** or locked, youāll see a warning; you can clear read-only attributes via file **Properties ā General** or:
Ā ```powershell
Ā Get-ChildItem -File -Recurse | ForEach-Object { $_.IsReadOnly = $false }
Ā ```
* Want to limit to just JPGs? Add: `-Extensions .jpg,.jpeg`
If youād like a version that uses each photoās **EXIF āDate takenā** (when available) instead of Date Modified, I can drop that in too.
Good question ā PowerShell wonāt prompt you to save the script automatically. Youāll need to create the script file once, then run it when you need it. Hereās how:
---
### š Step 1: Copy the Script Into a File
1. Open **Notepad** (or any text editor).
2. Copy the entire script I gave you into the blank file.
3. In Notepad, go to **File ā Save Asā¦**
Ā Ā * Navigate to the folder where your photos are (or another convenient location, like Desktop).
Ā Ā * In the **File name** box, type:
Ā Ā Ā ```
Ā Ā Ā Fix-CreationTime.ps1
Ā Ā Ā ```
Ā Ā * In **Save as type**, select **All Files**.
Ā Ā * Make sure it ends with `.ps1`, not `.txt`.
Now you have a PowerShell script file.
---
### š Step 2: Run the Script
1. Right-click the **Start menu** ā select **Windows PowerShell (Admin)** or **Windows Terminal (Admin)**.
2. Go to the folder where you saved the script, e.g.:
Ā Ā ```powershell
Ā Ā cd "C:\Users\YourName\Desktop"
Ā Ā ```
3. Run the script in **preview mode** first:
Ā Ā ```powershell
Ā Ā .\Fix-CreationTime.ps1 -Preview -Path "C:\Users\YourName\Pictures\iPhone Imports"
Ā Ā ```
Ā Ā * This will just *show* what changes it would make.
4. If everything looks correct, run it for real:
Ā Ā ```powershell
Ā Ā .\Fix-CreationTime.ps1 -Path "C:\Users\YourName\Pictures\iPhone Imports"
Ā Ā ```
---
### š Step 3: Execution Policy (only needed the first time)
If you see a warning like *āscripts are disabled on this systemā*, enter:
```powershell
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
```
Choose **Y** when prompted, then re-run the script.
---
š Do you want me to make you a **simpler āone-linerā script** (just paste into PowerShell without saving a file), or do you prefer the saved `.ps1` script that you can reuse?
Perfect ā hereās a version that uses the **EXIF `Date Taken`** metadata instead of `Date Modified`. That way, even if a photo was edited later (which can change the Modified date), youāll still restore the *actual camera timestamp*.
This script uses the built-in Windows property reader (no extra installs).
---
### š Script: `Fix-CreationTime-FromExif.ps1`
```powershell
<#
.SYNOPSIS
Ā Set "Date Created" to the EXIF "Date Taken" value
Ā (if available). Falls back to Date Modified otherwise.
.PARAMETER Path
Ā Folder to process. Default = current folder (.)
.PARAMETER Recurse
Ā Include all subfolders.
.PARAMETER Preview
Ā Show what would change, but don't modify anything.
.PARAMETER Extensions
Ā File extensions to include. Default covers common image types.
.PARAMETER Log
Ā Path to the CSV backup log. Default = TimestampBackup_Exif_yyyyMMdd_HHmmss.csv
#>
param(
Ā [string]$Path = ".",
Ā [switch]$Recurse,
Ā [switch]$Preview,
Ā [string[]]$Extensions = @(".jpg",".jpeg",".png",".heic",".tif",".tiff",".dng"),
Ā [string]$Log = ("TimestampBackup_Exif_{0}.csv" -f (Get-Date -Format "yyyyMMdd_HHmmss"))
)
# COM object for reading file metadata
$shell = New-Object -ComObject Shell.Application
function Get-DateTaken {
Ā Ā param([string]$FilePath)
Ā Ā $folder = $shell.Namespace((Split-Path $FilePath))
Ā Ā $file Ā = $folder.ParseName((Split-Path $FilePath -Leaf))
Ā Ā # On most systems, EXIF "Date Taken" is at index 12
Ā Ā $taken = $folder.GetDetailsOf($file, 12)
Ā Ā if ([string]::IsNullOrWhiteSpace($taken)) { return $null }
Ā Ā # Convert from localized string to DateTime
Ā Ā try { return [datetime]::Parse($taken) } catch { return $null }
}
# Resolve path & gather files
$resolved = Resolve-Path -Path $Path -ErrorAction Stop
$searchParams = @{ Path = $resolved; File = $true }
if ($Recurse) { $searchParams.Recurse = $true }
$all = Get-ChildItem @searchParams | Where-Object {
Ā $Extensions -contains ([System.IO.Path]::GetExtension($_.FullName).ToLower())
}
if (-not $all) {
Ā Write-Host "No matching files found in $resolved" -ForegroundColor Yellow
Ā return
}
# Backup original timestamps
$backup = $all | Select-Object `
Ā @{n='FullName';e={$_.FullName}},
Ā @{n='CreationTime';e={$_.CreationTime}},
Ā @{n='CreationTimeUtc';e={$_.CreationTimeUtc}},
Ā @{n='LastWriteTime';e={$_.LastWriteTime}},
Ā @{n='LastWriteTimeUtc';e={$_.LastWriteTimeUtc}}
$backup | Export-Csv -Path $Log -NoTypeInformation -Encoding UTF8
Write-Host "Backup log saved to: $Log" -ForegroundColor Cyan
# Apply or preview
$changed = 0
$errors Ā = 0
foreach ($f in $all) {
Ā try {
Ā Ā $exifDate = Get-DateTaken $f.FullName
Ā Ā $target Ā = $exifDate ? $exifDate : $f.LastWriteTime
Ā Ā $from Ā Ā = $f.CreationTime
Ā Ā if ($Preview) {
Ā Ā Ā Write-Host "[PREVIEW] $($f.Name)" -NoNewline
Ā Ā Ā Write-Host " Ā CreationTime: $from Ā -> Ā $target"
Ā Ā Ā continue
Ā Ā }
Ā Ā $f.CreationTimeUtc = $target.ToUniversalTime()
Ā Ā $f.CreationTime Ā Ā = $target
Ā Ā $changed++
Ā }
Ā catch {
Ā Ā $errors++
Ā Ā Write-Warning ("Failed to update: {0} Ā ({1})" -f $f.FullName, $_.Exception.Message)
Ā }
}
if ($Preview) {
Ā Write-Host "`nPreview complete. No files changed." -ForegroundColor Yellow
} else {
Ā Write-Host "`nDone. Files updated: $changed Ā | Ā Errors: $errors" -ForegroundColor Green
}
```
---
### š How to Use
1. Save as `Fix-CreationTime-FromExif.ps1` (same way as before).
2. Open **PowerShell (Admin)** and run in your photo folder:
Ā Ā **Preview first** (shows what would change):
Ā Ā ```powershell
Ā Ā .\Fix-CreationTime-FromExif.ps1 -Preview -Path "C:\Users\YourName\Pictures\iPhone Imports"
Ā Ā ```
Ā Ā **Apply for real**:
Ā Ā ```powershell
Ā Ā .\Fix-CreationTime-FromExif.ps1 -Path "C:\Users\YourName\Pictures\iPhone Imports"
Ā Ā ```
Ā Ā Add `-Recurse` if you want subfolders.
---
ā
This way, the *true camera-taken time* (from EXIF) is restored into **Date Created**, which is usually what you really want for photo organization.
Would you like me to also add an **option to choose between āuse Date Modifiedā vs āuse EXIF Date Takenā** inside a single script, so you donāt need two separate files?