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?