Calculator Tools Calculator Tools
Create

Growing Degree Day Calculator

Aug 19, 2026

About this app

Free growing degree day calculator. Daily GDD with crop base temperature and optional cap.

Growing Degree Day Calculator Growing Degree Day Calculator One day of heat units from Tmax, Tmin, and crop base. Not a season log of another index. Units °F °C Crop presetSets Tbase and Tcap. You can edit the boxes after. Custom Corn (Tbase 50 °F / 10 °C, cap 86 °F / 30 °C) Soybean (Tbase 50 °F / 10 °C, no cap) Wheat (Tbase 32 °F / 0 °C, no cap) Alfalfa (Tbase 41 °F / 5 °C, no cap) Daily maximum temperature Daily minimum temperature Base temperature Tbase Upper cap TcapBlank = no cap. Corn commonly caps Tmax at 86 °F (30 °C). Calculate GDD Formula Tmax_used = min(Tmax, Tcap) if a cap is set Tavg = (Tmax_used + Tmin) / 2 GDD = max(0, Tavg − Tbase) This is the simple average method used by many US extension services for corn (50/86 °F). It is not the Baskerville–Emin sine method. GDD in °F is not the same number as GDD in °C (factor 5/9). References Nielsen RL. Heat unit accumulation and corn development. Purdue University Extension. Corn 50 °F base, 86 °F cap. USDA / NASS and land-grant extension GDD documentation. Simple daily average with crop-specific Tbase. Field planning aid only. Confirm rates with your agronomist, label, and local extension. Not a pesticide or fertilizer...

Related apps

Put this on your site

Source

                    <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Growing Degree Day Calculator</title>
<meta name="description" content="Free growing degree day calculator. Daily GDD with crop base temperature and optional cap.">
<meta name="keywords" content="growing degree day, GDD calculator, corn GDD, Tbase, heat units, agronomy, crop development">
<style>
:root { --text:#1a1a1a; --muted:#4a4a4a; --line:#d6d6d6; --bg:#fff; --panel:#f6f6f6; }
html { -webkit-text-size-adjust:100%; text-size-adjust:100%; }
* { box-sizing:border-box; }
body {
margin:0;
font:16px/1.45 system-ui,-apple-system,sans-serif;
color:var(--text);
background:var(--bg);
overflow-x:hidden;
}
main {
max-width:720px;
margin:0 auto;
padding:24px 16px 48px;
padding-left:max(16px, env(safe-area-inset-left));
padding-right:max(16px, env(safe-area-inset-right));
}
html.in-viewer main {
padding-top:calc(4.25rem + env(safe-area-inset-top, 0px));
padding-right:calc(4.75rem + env(safe-area-inset-right, 0px));
padding-bottom:calc(6.5rem + env(safe-area-inset-bottom, 0px));
}
h1 { font-size:1.35rem; margin:0 0 0.35rem; }
h2 { font-size:1.05rem; margin:1.75rem 0 0.5rem; }
p, li { color:var(--text); }
.lede, .note, .disclaimer, label span { color:var(--muted); }
.lede, .disclaimer { font-size:0.95rem; }
label span { font-weight:400; font-size:0.85rem; }
form, .stack { display:grid; gap:14px; margin:1.25rem 0; }
fieldset {
border:1px solid var(--line);
border-radius:6px;
padding:12px;
display:grid;
gap:12px;
min-width:0;
}
legend { font-weight:600; padding:0 6px; }
label { display:grid; gap:4px; font-weight:600; }
.check { display:flex; align-items:center; gap:10px; font-weight:600; }
.check input { width:22px; height:22px; min-height:22px; flex:0 0 auto; }
input, select, textarea {
font:inherit;
font-size:16px;
min-height:44px;
padding:10px 12px;
border:1px solid var(--line);
border-radius:6px;
width:100%;
max-width:100%;
background:#fff;
}
button {
font:inherit;
font-size:16px;
font-weight:600;
width:100%;
min-height:48px;
padding:12px 14px;
border:0;
border-radius:6px;
background:#1a1a1a;
color:#fff;
cursor:pointer;
}
.result {
padding:16px;
background:var(--panel);
border:1px solid var(--line);
border-radius:6px;
}
.result strong { font-size:1.35rem; }
.parts { display:grid; gap:6px; margin-top:10px; font-size:0.95rem; }
pre.formula {
white-space:pre-wrap;
overflow-wrap:anywhere;
background:var(--panel);
border:1px solid var(--line);
border-radius:6px;
padding:12px;
font-size:0.9rem;
max-width:100%;
}
ol.refs { padding-left:1.25rem; }
ol.refs li { margin-bottom:0.6rem; }
a { color:inherit; }
.table-wrap { overflow-x:auto; -webkit-overflow-scrolling:touch; max-width:100%; }
table { border-collapse:collapse; width:100%; font-size:0.9rem; }
th, td { border:1px solid var(--line); padding:8px; text-align:left; vertical-align:top; }
.muted { color:var(--muted); font-size:0.9rem; }
</style>
</head>
<body>
<main>

<h1>Growing Degree Day Calculator</h1>
<p class="lede">One day of heat units from Tmax, Tmin, and crop base. Not a season log of another index.</p>
<form id="calc-form">
<label>Units<span></span>
<select id="units">
<option value="f" selected>°F</option>
<option value="c">°C</option>
</select>
</label>
<label>Crop preset<span>Sets Tbase and Tcap. You can edit the boxes after.</span>
<select id="crop">
<option value="custom">Custom</option>
<option value="corn" selected>Corn (Tbase 50 °F / 10 °C, cap 86 °F / 30 °C)</option>
<option value="soy">Soybean (Tbase 50 °F / 10 °C, no cap)</option>
<option value="wheat">Wheat (Tbase 32 °F / 0 °C, no cap)</option>
<option value="alfalfa">Alfalfa (Tbase 41 °F / 5 °C, no cap)</option>
</select>
</label>
<label>Daily maximum temperature<span></span>
<input id="tmax" type="number" step="any" inputmode="decimal" value="86">
</label>
<label>Daily minimum temperature<span></span>
<input id="tmin" type="number" step="any" inputmode="decimal" value="64">
</label>
<label>Base temperature Tbase<span></span>
<input id="tbase" type="number" step="any" inputmode="decimal" value="50">
</label>
<label>Upper cap Tcap<span>Blank = no cap. Corn commonly caps Tmax at 86 °F (30 °C).</span>
<input id="tcap" type="number" step="any" inputmode="decimal" value="86">
</label>
<button type="submit">Calculate GDD</button>
</form>
<div class="result" id="result" hidden></div>
<h2>Formula</h2>
<pre class="formula">Tmax_used = min(Tmax, Tcap) if a cap is set
Tavg = (Tmax_used + Tmin) / 2
GDD = max(0, Tavg − Tbase)

This is the simple average method used by many US extension services
for corn (50/86 °F). It is not the Baskerville–Emin sine method.

GDD in °F is not the same number as GDD in °C (factor 5/9).</pre>
<h2>References</h2>
<ol class="refs">
<li>Nielsen RL. Heat unit accumulation and corn development. Purdue University Extension. Corn 50 °F base, 86 °F cap.</li>
<li>USDA / NASS and land-grant extension GDD documentation. Simple daily average with crop-specific Tbase.</li>
</ol>
<p class="disclaimer">Field planning aid only. Confirm rates with your agronomist, label, and local extension. Not a pesticide or fertilizer recommendation.</p>
</main>
<script>

if (window.self !== window.top) {
document.documentElement.classList.add('in-viewer');
}
function num(id) {
var el = document.getElementById(id);
if (!el) return 0;
var value = parseFloat(el.value);
return isFinite(value) && value > 0 ? value : 0;
}
function raw(id) {
var el = document.getElementById(id);
if (!el) return NaN;
var value = parseFloat(el.value);
return isFinite(value) ? value : NaN;
}
function sel(id) {
var el = document.getElementById(id);
return el ? el.value : '';
}
function showResult(html) {
var el = document.getElementById('result');
el.hidden = false;
el.innerHTML = html;
}
function fmt(value, digits) {
if (!isFinite(value)) return '—';
return value.toFixed(digits);
}


var PRESET = {
corn: { f: [50, 86], c: [10, 30] },
soy: { f: [50, ''], c: [10, ''] },
wheat: { f: [32, ''], c: [0, ''] },
alfalfa: { f: [41, ''], c: [5, ''] }
};
document.getElementById('crop').addEventListener('change', function () {
var crop = sel('crop');
if (crop === 'custom' || !PRESET[crop]) return;
var pair = PRESET[crop][sel('units')];
document.getElementById('tbase').value = pair[0];
document.getElementById('tcap').value = pair[1];
});
document.getElementById('units').addEventListener('change', function () {
document.getElementById('crop').dispatchEvent(new Event('change'));
});
document.getElementById('calc-form').addEventListener('submit', function (event) {
event.preventDefault();
var tmax = raw('tmax'), tmin = raw('tmin'), tbase = raw('tbase'), tcap = raw('tcap');
if (!isFinite(tmax) || !isFinite(tmin) || !isFinite(tbase)) {
showResult('<p>Enter Tmax, Tmin, and Tbase.</p>');
return;
}
var tmaxUsed = isFinite(tcap) ? Math.min(tmax, tcap) : tmax;
var tavg = (tmaxUsed + tmin) / 2;
var gdd = Math.max(0, tavg - tbase);
var unit = sel('units') === 'c' ? '°C-days' : '°F-days';
showResult(
'<div>Growing degree days</div><strong>' + fmt(gdd, 1) + '</strong><span> ' + unit + '</span>' +
'<div class="parts"><div>Tmax used = ' + fmt(tmaxUsed, 1) + '</div><div>Tavg = ' + fmt(tavg, 1) + '</div></div>'
);
});

</script>
</body>
</html>