Bacterial Generation Time Calculator
The bacterial generation time calculator determines how long a culture takes to complete one generation when you know the total elapsed time and the number of generations observed.
Run — free
Because one generation corresponds to one population doubling under binary fission, the result is also reported as doubling time. Choose seconds, minutes, hours, or days, and the calculator keeps the answer in that same unit while also showing generations per hour for convenient comparison between cultures or experimental conditions.
Enter the observation interval and generation count
Start with the elapsed time for the growth interval you are analyzing, then enter how many generations occurred during that interval. Both values must be positive, and the generation count may be fractional when it was estimated from population measurements rather than counted as a whole number. Select the unit that describes the elapsed time: seconds, minutes, hours, or days. The calculator returns the generation time in that same unit, so an elapsed time entered in minutes produces a result in minutes per generation. Make sure the elapsed time and the generation estimate describe exactly the same interval. For example, if six generations occurred during a 180-minute exponential-growth interval, enter 180 and 6, not the total duration of an experiment that also included lag or stationary phases. Keeping the observation window consistent is essential because the arithmetic cannot distinguish active exponential growth from periods when the population was adapting, depleted, or declining. The output also includes generations per hour, which makes results recorded in different time units easier to compare without an extra conversion step.
Understand the calculation and its assumptions
Generation time is calculated as elapsed time divided by the number of generations: g = t / n. In a bacterial population reproducing by binary fission, each completed generation doubles the population, so generation time and doubling time refer to the same interval in this calculation. If a culture completes six generations in 180 minutes, its generation time is 30 minutes and its doubling time is likewise 30 minutes. The calculator also converts the observation interval to hours and divides the generation count by that duration to report generations per hour. No growth model is fitted, and no assumptions are made about species, medium, temperature, optical density, or colony counts beyond the generation count you supply. This matters when generation count was derived separately using logarithms of initial and final population sizes: any uncertainty in those measurements carries into the result. The method is most meaningful for an interval in which exponential growth is a reasonable approximation. It does not claim that every cell divides synchronously or that the calculated average describes every individual organism in a heterogeneous culture.
Interpret and report the result responsibly
Use the returned generation time as a compact summary of growth over the chosen interval. A smaller value indicates faster average population doubling, while a larger value indicates slower growth. When comparing treatments, keep the organism, medium, temperature, aeration, inoculum condition, measurement method, and analyzed growth phase as consistent as possible. A difference in calculated doubling time may reflect biology, but it may also reflect a different observation window or uncertainty in the estimated number of generations. Report the original elapsed time, selected unit, generation count, and calculated value together so another person can reproduce the arithmetic. Retain sensible precision: the calculator preserves useful decimal results, but many displayed digits do not make an imprecise cell count or optical-density estimate more accurate. This tool performs only the deterministic division and unit conversion; it does not infer generations from starting and ending cell counts, test whether growth was exponential, or assess experimental quality. For publication or regulated laboratory work, apply the uncertainty analysis, quality controls, and reporting practices required by your protocol rather than treating this single calculated value as a complete growth characterization.
What you can do with it
Summarize an exponential-growth interval
Convert an observed number of bacterial generations over a timed interval into minutes or hours per generation.
Compare culture conditions
Calculate doubling times for matched cultures grown under different temperatures, media, or treatments.
Check laboratory calculations
Reproduce the basic elapsed-time-per-generation arithmetic used in a growth-curve worksheet or report.
FAQ
What formula does the calculator use?
It uses generation time = elapsed time / number of generations. The same value is returned as doubling time for binary fission.
Can the number of generations be fractional?
Yes. A positive fractional generation count is valid when generations were estimated from population measurements.
Which time units are supported?
You can enter elapsed time in seconds, minutes, hours, or days. Generation and doubling time are returned in the selected unit.
Does this calculate generations from initial and final cell counts?
No. Supply the generation count directly; this capability calculates time per generation from that count and the elapsed time.
Should lag phase be included in elapsed time?
Usually not when the goal is an exponential-phase generation time. Use the interval associated with the generations you measured and follow your experimental protocol.
What does the API request cost?
The API costs $0.002 per request. The browser calculation is available free on the capability page.
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/bio/generation-time \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"elapsed_time":180,"generations":6}'const res = await fetch("https://api.kit.forhosting.com/bio/generation-time", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"elapsed_time": 180,
"generations": 6
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/bio/generation-time",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"elapsed_time": 180,
"generations": 6
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/bio/generation-time", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"elapsed_time":180,"generations":6}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"elapsed_time":180,"generations":6}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/bio/generation-time", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"elapsed_time": 180,
"generations": 6
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "bio.generation_time",
"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.
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. |