I've been trying for hours, but I can't figure it out. Here is the badge awarding script below:
local BadgeService = game:GetService("BadgeService")
local Players = game:GetService("Players")
local badgeID = 2124518441 -- Change this to your badge ID
local function awardBadge()
local player = Players.LocalPlayer
local hasBadge = false
-- Check if the player already has the badge
local success, message = pcall(function()
hasBadge = BadgeService:UserHasBadgeAsync(player.UserId, badgeID)
end)
-- If there's an error, issue a warning and exit the function
if not success then
warn("Error while checking if player has badge: " .. tostring(message))
return
end
if hasBadge == false then
BadgeService:AwardBadge(player.UserId, badgeID)
end
end

3 comments
You can see more here : https://developer.roblox.com/en-us/articles/Badges-Special-Game-Awards
You could try using tick() when the player joins the game. Figure out the time elapsed by subtracting the tick() for when the player joined the game and when they leave the game. Then save it using datatstore.
yeah or you could just use wait(3600)