Hours and minutes converter
2.5 hours on a timesheet is 2 hours and 30 minutes on the clock. Enter any decimal hour count from a payroll export or spreadsheet and get the whole hours plus the leftover minutes, rounded to the nearest minute. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Hours
- 2.5
- Decimal hours
- 2.5
- Hours
- 2
- Minutes
- 30
- Total minutes
- 150
Payroll sheets, timesheets, and school homework often store time as a decimal number of hours — two point five, seven point seven five, one quarter — while people read clocks as whole hours and leftover minutes. This hours-and-minutes converter takes one finite non-negative decimal hour count and splits it into whole hours plus the remaining minutes: two point five hours becomes two hours and thirty minutes; one point seven five hours becomes one hour and forty-five minutes. Zero is valid and yields zero hours and zero minutes. A negative value, Infinity, or a non-numeric token is rejected with invalid input and is not billed. There is no network call, no system clock, and no randomness — only multiply by sixty, nearest-minute rounding, and an integer remainder.
How decimal hours become whole hours and remaining minutes
A decimal hour is a single real number that measures a duration in hours, including a fractional part that stands for leftover time. Two point five hours is two full hours plus one half of an hour; seven point seven five hours is seven full hours plus three quarters of an hour. People write those values in spreadsheets, payroll exports, and time-tracking APIs because a single number is easy to add and to store.
Humans, however, read a clock as whole hours and leftover minutes: two hours thirty minutes, not two point five. This converter performs that split and nothing else. It multiplies the decimal hour count by sixty to obtain total minutes, rounds to the nearest whole minute so floating-point leftovers do not become fifty-nine point nine nine nine, then takes the whole hours as the integer quotient of that minute count divided by sixty and the remaining minutes as the remainder.
Two point five maps to one hundred fifty minutes, which is two hours and thirty minutes. One point seven five maps to one hundred five minutes, which is one hour and forty-five minutes. Zero maps to zero hours and zero minutes.
Eight hours even maps to eight hours and zero minutes, not a blank remainder.
Where an hours-and-minutes split earns its keep
People reach for a decimal-hours-to-hours-and-minutes converter whenever a system stores time as a single real number and a human must read it on a clock. Payroll clerks convert 7.5 or 8.25 billed hours into seven hours thirty minutes or eight hours fifteen minutes before they print a payslip that refuses decimal hours. Project managers turn a timesheet export of 1.75 hours into one hour forty-five minutes for a status slide.
Teachers and tutors assign the conversion so students practice multiplying by sixty and taking a remainder instead of guessing that two point three hours is two hours three minutes. Parking, clinic, and studio software often stores stay length as a decimal hour and needs a display string such as 2h 30m. Because the tool rejects a negative duration and non-finite tokens, it also doubles as a validator for intake forms that must not accept minus two hours.
Pair this page with a generic time-unit converter if you also need seconds, days, or weeks, with a clock-duration tool if you have two wall-clock readings rather than a decimal, or with an hours-minutes-seconds-to-seconds converter if you are going the other direction from a clock triple.
What you can do with it
Payroll and timesheet display
Turn 7.5 or 8.25 billed hours into seven hours thirty minutes or eight hours fifteen minutes for a payslip that prints clock time, not a decimal.
Classroom remainder practice
Let students verify that 2.5 hours is two hours thirty minutes, and that a negative hour count is rejected instead of printed as a signed remainder.
Stay-length and status-slide labels
Convert a stored decimal stay or logged effort into a 2h 30m string for parking, clinic, studio, or project-status copy.
FAQ
Why is 2.5 hours equal to 2 hours 30 minutes and not 2 hours 50 minutes?
The fractional part is a fraction of an hour, not a digit dump. Half of sixty minutes is thirty, so 2.5 hours is 2 hours 30 minutes. 2.50 is the same duration.
Are leftover minutes rounded?
Yes. Total minutes are rounded to the nearest whole minute so floating-point leftovers do not become 19.999 minutes. A rounded remainder of 60 carries into the next hour.
How many hours and minutes is 7.75 hours?
It is 7 hours and forty-five minutes, because three quarters of an hour is forty-five minutes. In the same way, 8.25 hours on a payslip is 8 hours and fifteen minutes, and 7.5 hours is 7 hours 30 minutes.
How do I turn decimal hours into hours and minutes by hand?
Multiply the decimal by sixty to get the total minutes, then divide that by sixty: the whole number is the hours and the remainder is the minutes. For 1.75 hours that gives one hundred five minutes, which is 1 hour and forty-five minutes.
Can I also see the result as a total number of minutes?
Yes. Along with the hours and minutes you get the total minutes, so 2.5 hours also shows as 150 minutes. A whole number such as 8 hours shows as 8 hours and 0 minutes rather than a blank remainder.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/life/hours-minutes \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"hours":2.5}'const res = await fetch("https://api.kit.forhosting.com/life/hours-minutes", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"hours": 2.5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/life/hours-minutes",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"hours": 2.5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/life/hours-minutes", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"hours":2.5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"hours":2.5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/life/hours-minutes", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"hours": 2.5
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "life.hours_minutes",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_abs_value | 1000000000000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Successful API requests cost $0.002.
How decimal hours become whole hours and remaining minutes
The algorithm never consults the system clock, never calls a network service, and never uses randomness, so the same decimal always produces the same hours, minutes, total_minutes, and pretty string.
Input contract, nearest-minute rounding, and errors
The value is the decimal duration in hours to split, and it must be a finite non-negative number. Fractional hours are allowed and expected. A negative hours value fails with a clear message that decimal hours cannot be negative, because a duration on this landing is not a signed ledger. Minutes are always in the closed range from zero through fifty-nine; a remainder that would have been sixty after rounding carries into the next hour. Invalid input is not billed. The request body carries one required number: hours. Aliases h, decimal_hours, and value are accepted so a form, a query string, or a spreadsheet column can reuse the same contract without renaming the input. The value may arrive as a JSON number or as a decimal numeric string, including an optional leading plus and scientific notation; embedded spaces, hex prefixes, and non-numeric tokens fail with a message that names the field. Missing hours, an empty string after trim, Infinity, and NaN fail with invalid_input and are not billed. On success the body echoes decimal_hours, returns whole hours and remaining minutes as integers, total_minutes as the nearest whole-minute count, a pretty string such as 2h 30m, and a short formula you can print next to the answer. Successful API calls use the published $0.002 base price.
Where an hours-and-minutes split earns its keep
That keeps latency at a handful of arithmetic operations and keeps the cost model honest at $0.002 per successful API request, while failed validation never consumes prepaid balance.
Technical questions
How do I convert decimal hours to hours and minutes?
Send hours as a finite non-negative number. The API multiplies by 60, rounds to the nearest whole minute, then returns whole hours and the remaining minutes (0–59).
What happens if I enter a negative number of hours?
The request is rejected with invalid_input and is not charged. This converter is defined only for a finite non-negative hour count.
What does the hours and minutes converter cost?
The browser tool is free. API requests use prepaid balance at $0.002 per successful call; invalid input is not billed.