{"id":2666,"date":"2026-08-08T03:10:54","date_gmt":"2026-08-08T03:10:54","guid":{"rendered":"https:\/\/dr-nutrition.ca\/?page_id=2666"},"modified":"2026-08-08T03:15:53","modified_gmt":"2026-08-08T03:15:53","slug":"title-when","status":"publish","type":"page","link":"https:\/\/dr-nutrition.ca\/?page_id=2666","title":{"rendered":"Corn silage \u2014 when to harvest"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2666\" class=\"elementor elementor-2666\">\n\t\t\t\t<div class=\"elementor-element elementor-element-dc245c4 e-flex e-con-boxed e-con e-parent\" data-id=\"dc245c4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-43aaceb elementor-widget elementor-widget-shortcode\" data-id=\"43aaceb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div class=\"smc\" id=\"smc1\">\n<style>\n.smc{--k:#12211a;--b:#2c4437;--t:#e8f0ea;--m:#9fb3a6;--g:#d9b64a;\nbackground:var(--k);color:var(--t);border:1px solid var(--b);border-radius:14px;padding:20px;margin:16px 0;\nfont-family:system-ui,-apple-system,\"Segoe UI\",Roboto,Arial,sans-serif;line-height:1.45;max-width:820px;}\n.smc *{box-sizing:border-box;}\n.smc h2{font-size:20px;margin:0 0 4px;color:var(--t);}\n.smc .sub{color:var(--m);font-size:13.5px;margin:0 0 18px;}\n.smc .grp{border:1px solid var(--b);border-radius:10px;padding:14px;margin:0 0 12px;background:rgba(255,255,255,.03);}\n.smc .grp h3{font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:var(--m);margin:0 0 10px;font-weight:600;}\n.smc .r{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end;}\n.smc .f{flex:1 1 120px;min-width:110px;}\n.smc label{display:block;font-size:11.5px;color:var(--m);margin:0 0 4px;}\n.smc input,.smc select{width:100%;background:#0c1713;color:var(--t);border:1px solid var(--b);\nborder-radius:8px;padding:9px 10px;font-size:15px;font-family:inherit;}\n.smc input:focus,.smc select:focus{outline:2px solid var(--g);outline-offset:1px;}\n.smc .dm{flex:0 0 100px;text-align:right;font-size:20px;font-weight:700;color:var(--g);padding-bottom:7px;white-space:nowrap;}\n.smc .dm small{display:block;font-size:11px;color:var(--m);font-weight:400;}\n.smc .ban{border-radius:10px;padding:14px 16px;font-weight:800;font-size:17px;color:#0d1512;margin:0 0 12px;letter-spacing:.01em;}\n.smc .cards{display:flex;flex-wrap:wrap;gap:10px;margin:0 0 12px;}\n.smc .c{flex:1 1 150px;min-width:140px;border:1px solid var(--b);border-radius:10px;padding:13px;background:rgba(255,255,255,.04);}\n.smc .c .l{font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--m);margin:0 0 5px;}\n.smc .c .v{font-size:27px;font-weight:700;line-height:1.05;}\n.smc .c .v.sm{font-size:19px;}\n.smc .c small{color:var(--m);font-size:11.5px;}\n.smc .bar{position:relative;height:28px;border-radius:7px;background:#0c1713;border:1px solid var(--b);overflow:hidden;margin:4px 0 6px;}\n.smc .bar i{position:absolute;top:0;bottom:0;background:rgba(76,175,125,.30);}\n.smc .bar b{position:absolute;top:0;bottom:0;width:3px;background:var(--g);}\n.smc .scale{display:flex;justify-content:space-between;font-size:11px;color:var(--m);margin:0 0 14px;}\n.smc .w{border-left:3px solid var(--g);background:rgba(217,182,74,.09);padding:10px 12px;border-radius:0 8px 8px 0;\nmargin:0 0 8px;font-size:13.5px;color:var(--t);}\n.smc .w.bad{border-left-color:#e2703a;background:rgba(226,112,58,.11);}\n.smc details{margin:12px 0 0;} .smc summary{cursor:pointer;color:var(--g);font-size:13.5px;}\n.smc details p{font-size:13.5px;color:var(--t);margin:8px 0 0;}\n.smc .foot{font-size:11.5px;color:var(--m);margin:14px 0 0;}\n@media print{.smc{background:#fff;color:#111;border-color:#bbb;}\n.smc h2,.smc .c .v,.smc details p{color:#111;} .smc .c{background:#f5f5f2;} .smc details,.smc summary{display:none;}}\n<\/style>\n\n<h2>Corn silage \u2014 when to harvest<\/h2>\n<p class=\"sub\">Enter one whole-plant dry matter test to get an estimate. Enter a second, taken 3&ndash;5 days later, and the calculator uses this field's own drying rate instead of an average.<\/p>\n\n<div class=\"grp\">\n  <h3>Test 1<\/h3>\n  <div class=\"r\">\n    <div class=\"f\" style=\"flex:1 1 140px\"><label>Date sampled<\/label><input type=\"date\" id=\"smc1_d1\"><\/div>\n    <div class=\"f\"><label>Wet weight<\/label><input type=\"number\" step=\"0.1\" min=\"0\" id=\"smc1_w1\" placeholder=\"100\"><\/div>\n    <div class=\"f\"><label>Dry weight<\/label><input type=\"number\" step=\"0.1\" min=\"0\" id=\"smc1_y1\" placeholder=\"27.4\"><\/div>\n    <div class=\"f\"><label>or DM % direct<\/label><input type=\"number\" step=\"0.1\" min=\"10\" max=\"60\" id=\"smc1_p1\" placeholder=\"27.4\"><\/div>\n    <div class=\"dm\" id=\"smc1_o1\">&mdash;<small>dry matter<\/small><\/div>\n  <\/div>\n<\/div>\n\n<div class=\"grp\">\n  <h3>Test 2 &nbsp;<span style=\"text-transform:none;letter-spacing:0;font-weight:400\">(optional, but much more accurate)<\/span><\/h3>\n  <div class=\"r\">\n    <div class=\"f\" style=\"flex:1 1 140px\"><label>Date sampled<\/label><input type=\"date\" id=\"smc1_d2\"><\/div>\n    <div class=\"f\"><label>Wet weight<\/label><input type=\"number\" step=\"0.1\" min=\"0\" id=\"smc1_w2\" placeholder=\"100\"><\/div>\n    <div class=\"f\"><label>Dry weight<\/label><input type=\"number\" step=\"0.1\" min=\"0\" id=\"smc1_y2\" placeholder=\"30.1\"><\/div>\n    <div class=\"f\"><label>or DM % direct<\/label><input type=\"number\" step=\"0.1\" min=\"10\" max=\"60\" id=\"smc1_p2\" placeholder=\"30.1\"><\/div>\n    <div class=\"dm\" id=\"smc1_o2\">&mdash;<small>dry matter<\/small><\/div>\n  <\/div>\n<\/div>\n\n<div class=\"grp\">\n  <h3>Where it is going<\/h3>\n  <div class=\"r\">\n    <div class=\"f\" style=\"flex:2 1 240px\"><label>Storage structure<\/label>\n      <select id=\"smc1_st\">\n        <option value=\"bunker\">Bunker silo &mdash; 30 to 36% DM<\/option>\n        <option value=\"pile\">Drive-over pile &mdash; 30 to 35% DM<\/option>\n        <option value=\"bag\">Silage bag &mdash; 32 to 40% DM<\/option>\n        <option value=\"stave\">Upright concrete stave &mdash; 35 to 42% DM<\/option>\n        <option value=\"sealed\">Sealed \/ oxygen-limiting &mdash; 38 to 45% DM<\/option>\n      <\/select>\n    <\/div>\n    <div class=\"f\"><label>Drying rate (%DM\/day)<\/label><input type=\"number\" step=\"0.05\" min=\"0.1\" max=\"1.5\" id=\"smc1_rt\" placeholder=\"auto\"><\/div>\n  <\/div>\n<\/div>\n\n<div id=\"smc1_out\"><\/div>\n\n<details>\n  <summary>How to take the sample so the number means something<\/summary>\n  <p>Walk a diagonal across the field and cut <strong>8 to 10 whole plants<\/strong> at your normal chop height. Skip the headlands, the end rows and any thin or drowned-out patch &mdash; they are not what the chopper will average. Run the plants through a chipper or shredder, spread the chop on a tarp and quarter it down to a handful, about 100 g.<\/p>\n  <p>Weigh it wet. Dry it in a Koster tester or a microwave until the weight stops falling &mdash; re-weigh every 30 seconds near the end and stop when two weighings match. Weigh it dry. Units do not matter as long as both weights use the same one.<\/p>\n  <p>Two things wreck the number: sampling only the good end of the field, and sampling within a day of rain, because surface water on the leaves reads the crop wetter than it is. Sample the same way every time. A consistent method matters more than a perfect one, because the second test is measuring the <em>change<\/em> from the first.<\/p>\n<\/details>\n\n<p class=\"foot\">This is a projection from your own tests, not a guarantee. Re-test every 3 days once the crop is within 5 points of target, and confirm with a fresh sample before the chopper rolls.<\/p>\n<\/div>\n\n<script>\n(function(){\n  var R = \"smc1\";\n  var g = function(s){ return document.getElementById(R+\"_\"+s); };\n  var T = {\n    bunker:{n:\"bunker silo\",  lo:30, opt:34, hi:36},\n    pile:  {n:\"drive-over pile\", lo:30, opt:33, hi:35},\n    bag:   {n:\"silage bag\",   lo:32, opt:36, hi:40},\n    stave: {n:\"upright stave silo\", lo:35, opt:38, hi:42},\n    sealed:{n:\"sealed silo\",  lo:38, opt:42, hi:45}\n  };\n  var DEF = 0.50, FLOOR = 0.10, CAP = 1.20;\n\n  function today(){ var d=new Date(); d.setHours(0,0,0,0); return d; }\n  function parse(v){ if(!v) return null; var d=new Date(v+\"T00:00:00\"); return isNaN(d)?null:d; }\n  function days(a,b){ return Math.round((b-a)\/86400000); }\n  function addDays(d,n){ var x=new Date(d.getTime()); x.setDate(x.getDate()+Math.round(n)); return x; }\n  function fmt(d){ return d.toLocaleDateString(undefined,{weekday:\"short\",day:\"numeric\",month:\"short\"}); }\n\n  function dmOf(i){\n    var direct = parseFloat(g(\"p\"+i).value);\n    if(!isNaN(direct) && direct > 0) return direct;\n    var w = parseFloat(g(\"w\"+i).value), y = parseFloat(g(\"y\"+i).value);\n    if(isNaN(w) || isNaN(y) || w <= 0 || y <= 0 || y > w) return null;\n    return (y\/w)*100;\n  }\n\n  function calc(){\n    var warn = [], out = g(\"out\");\n    var dm1 = dmOf(1), dm2 = dmOf(2);\n    var d1 = parse(g(\"d1\").value), d2 = parse(g(\"d2\").value);\n\n    g(\"o1\").innerHTML = dm1===null ? \"&mdash;<small>dry matter<\/small>\"\n      : dm1.toFixed(1)+\"%<small>\"+(100-dm1).toFixed(1)+\"% moisture<\/small>\";\n    g(\"o2\").innerHTML = dm2===null ? \"&mdash;<small>dry matter<\/small>\"\n      : dm2.toFixed(1)+\"%<small>\"+(100-dm2).toFixed(1)+\"% moisture<\/small>\";\n\n    for(var q=1;q<=2;q++){\n      var qw = parseFloat(g(\"w\"+q).value), qy = parseFloat(g(\"y\"+q).value);\n      if(!isNaN(qw) && qw <= 0) warn.push([\"bad\",\"Test \"+q+\": the wet weight has to be more than zero.\"]);\n      else if(!isNaN(qw) && !isNaN(qy) && qy > qw) warn.push([\"bad\",\"Test \"+q+\": the dry weight is heavier than the wet weight, which cannot happen. The wet weight goes in first, the oven-dry weight second.\"]);\n    }\n    if(dm1===null && dm2===null){\n      var wh = \"\";\n      for(var z=0;z<warn.length;z++){ wh += '<div class=\"w '+(warn[z][0]===\"bad\"?\"bad\":\"\")+'\">'+warn[z][1]+'<\/div>'; }\n      out.innerHTML = wh; return;\n    }\n    if(dm1!==null && (dm1<15||dm1>60)) warn.push([\"bad\",\"Test 1 works out to \"+dm1.toFixed(1)+\"% dry matter, which is outside the plausible range for whole-plant corn. Check the weights &mdash; dry weight goes in the second box.\"]);\n    if(dm2!==null && (dm2<15||dm2>60)) warn.push([\"bad\",\"Test 2 works out to \"+dm2.toFixed(1)+\"% dry matter, which is outside the plausible range. Check the weights.\"]);\n\n    \/\/ pick the most recent usable test\n    var lastDm, lastDate, rate = null, rateSrc = \"\";\n    if(dm2!==null && dm1!==null && d1 && d2){\n      var gap = days(d1,d2);\n      if(gap < 0){ var td=d1; d1=d2; d2=td; var tm=dm1; dm1=dm2; dm2=tm; gap=-gap; }\n      if(gap < 3){\n        warn.push([\"\",\"The two tests are \"+gap+\" day\"+(gap===1?\"\":\"s\")+\" apart. That is too close to measure a drying rate reliably &mdash; leave at least 3 days between tests. Using the average rate for now.\"]);\n      } else {\n        rate = (dm2-dm1)\/gap; rateSrc = \"measured over \"+gap+\" days\";\n      }\n      lastDm = dm2; lastDate = d2;\n    } else {\n      lastDm = (dm2!==null && d2) ? dm2 : dm1;\n      lastDate = (dm2!==null && d2) ? d2 : d1;\n      if(dm1!==null && dm2!==null && (!d1 || !d2)) warn.push([\"\",\"Add both sample dates and the calculator will work out this field's own drying rate instead of using an average.\"]);\n    }\n    if(lastDm===null || !lastDate){ out.innerHTML='<div class=\"w\">Enter a sample date to get a harvest date.<\/div>'; return; }\n\n    var manual = parseFloat(g(\"rt\").value);\n    if(!isNaN(manual) && manual>0){ rate = Math.max(0.1,Math.min(1.5,manual)); rateSrc = \"entered by hand\"; }\n    else if(rate!==null && rate < FLOOR){\n      warn.push([\"bad\",\"The two tests show almost no drying, or the crop got wetter. That usually means rain re-wetted it between tests, or the two samples were taken differently. Using the average rate of \"+DEF.toFixed(2)+\" until the next test.\"]);\n      rate = DEF; rateSrc = \"average, measured rate rejected\";\n    }\n    else if(rate!==null && rate > CAP){\n      warn.push([\"bad\",\"The measured drying is \"+rate.toFixed(2)+\" points a day, which is very fast &mdash; drought, frost or a hot dry spell will do this. It has been capped at \"+CAP.toFixed(2)+\" for the projection. Re-test within 2 days.\"]);\n      rate = CAP; rateSrc = \"measured, capped\";\n    }\n    if(rate===null){ rate = DEF; rateSrc = \"average for corn silage, no second test\"; }\n\n    var t = T[g(\"st\").value];\n    var age = Math.max(0, days(lastDate, today()));\n    if(age > 7) warn.push([\"bad\",\"The last test is \"+age+\" days old. Take a fresh one before acting on these dates.\"]);\n    var dmNow = lastDm + rate*age;\n\n    function when(target){\n      var d = (target - dmNow)\/rate;\n      return { days: Math.round(d), date: addDays(today(), d), past: d <= 0 };\n    }\n    var wOpen = when(t.lo), wBest = when(t.opt), wClose = when(t.hi);\n    var width = Math.round((t.hi - t.lo)\/rate);\n\n    var status, colour;\n    if(dmNow >= t.hi){ status = \"PAST THE WINDOW \\u2014 too dry\"; colour = \"#e2703a\"; }\n    else if(dmNow >= t.lo){ status = \"IN THE HARVEST WINDOW\"; colour = \"#4caf7d\"; }\n    else if(wOpen.days <= 5){ status = \"ALMOST READY\"; colour = \"#d9b64a\"; }\n    else { status = \"TOO WET \\u2014 keep testing\"; colour = \"#6f97ab\"; }\n\n    var lo = t.lo-6, hi = t.hi+6, span = hi-lo;\n    var fillL = ((t.lo-lo)\/span)*100, fillW = ((t.hi-t.lo)\/span)*100;\n    var mark  = Math.max(0, Math.min(100, ((dmNow-lo)\/span)*100));\n\n    var h = '<div class=\"ban\" style=\"background:'+colour+'\">'+status+'<\/div>';\n    h += '<div class=\"cards\">';\n    h += '<div class=\"c\"><div class=\"l\">Dry matter today<\/div><div class=\"v\">'+dmNow.toFixed(1)+'%<\/div><small>'+(100-dmNow).toFixed(1)+'% moisture<\/small><\/div>';\n    h += '<div class=\"c\"><div class=\"l\">Drying at<\/div><div class=\"v\">'+rate.toFixed(2)+'<\/div><small>% DM per day &mdash; '+rateSrc+'<\/small><\/div>';\n    h += '<div class=\"c\"><div class=\"l\">Best harvest date<\/div><div class=\"v sm\">'+(wBest.past?\"now\":fmt(wBest.date))+'<\/div><small>at '+t.opt+'% DM<\/small><\/div>';\n    h += '<div class=\"c\"><div class=\"l\">'+(wClose.past?\"Window was\":\"Window stays open\")+'<\/div><div class=\"v\">'+width+'<\/div><small>days wide, for a '+t.n+'<\/small><\/div>';\n    h += '<\/div>';\n\n    h += '<div class=\"bar\"><i style=\"left:'+fillL.toFixed(1)+'%;width:'+fillW.toFixed(1)+'%\"><\/i><b style=\"left:'+mark.toFixed(1)+'%\"><\/b><\/div>';\n    h += '<div class=\"scale\"><span>'+lo+'% DM<\/span><span>green band = '+t.lo+' to '+t.hi+'% target<\/span><span>'+hi+'% DM<\/span><\/div>';\n\n    h += '<div class=\"w\">';\n    if(wOpen.past && !wClose.past){\n      h += 'The crop is already dry enough to store. It stays in spec until about <strong>'+fmt(wClose.date)+'<\/strong>, so you have roughly <strong>'+wClose.days+' day'+(wClose.days===1?\"\":\"s\")+'<\/strong> of chopping window left.';\n    } else if(wClose.past){\n      h += 'The crop is past '+t.hi+'% DM. It will not pack tight and will heat in the pile. Raising the cutting height will not fix it either. Chop it off as fast as you can, shorten the length of cut, close the processor rolls up, spread it in thin layers and pack longer than you think you need to, cover the same day, and plan on a proven inoculant for aerobic stability. Do not try to wet it down at the pile &mdash; water on the surface does not reach the inside of the plant material and gives you an uneven fermentation on top of a dry one.';\n    } else {\n      h += 'The window opens around <strong>'+fmt(wOpen.date)+'<\/strong> ('+wOpen.days+' day'+(wOpen.days===1?\"\":\"s\")+'), the best day is around <strong>'+fmt(wBest.date)+'<\/strong>, and it closes around <strong>'+fmt(wClose.date)+'<\/strong>.';\n    }\n    h += '<\/div>';\n\n    if(rateSrc.indexOf(\"no second test\") > -1){\n      warn.push([\"\",\"This is running on the average drying rate of 0.50 points a day. Real fields run anywhere from 0.3 to 0.8 depending on heat and hybrid, so a second test 3 to 5 days after the first is worth a lot more than a better guess.\"]);\n    }\n    for(var i=0;i<warn.length;i++){ h += '<div class=\"w '+(warn[i][0]===\"bad\"?\"bad\":\"\")+'\">'+warn[i][1]+'<\/div>'; }\n    out.innerHTML = h;\n  }\n\n  var ids = [\"d1\",\"w1\",\"y1\",\"p1\",\"d2\",\"w2\",\"y2\",\"p2\",\"st\",\"rt\"];\n  for(var i=0;i<ids.length;i++){\n    var el = g(ids[i]);\n    el.addEventListener(\"input\", calc);\n    el.addEventListener(\"change\", calc);\n  }\n  var iso = new Date(); iso.setMinutes(iso.getMinutes()-iso.getTimezoneOffset());\n  g(\"d2\").value = iso.toISOString().slice(0,10);\n  calc();\n})();\n<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2666","page","type-page","status-publish","hentry"],"brizy_media":[],"_links":{"self":[{"href":"https:\/\/dr-nutrition.ca\/index.php?rest_route=\/wp\/v2\/pages\/2666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dr-nutrition.ca\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/dr-nutrition.ca\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/dr-nutrition.ca\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dr-nutrition.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2666"}],"version-history":[{"count":5,"href":"https:\/\/dr-nutrition.ca\/index.php?rest_route=\/wp\/v2\/pages\/2666\/revisions"}],"predecessor-version":[{"id":2674,"href":"https:\/\/dr-nutrition.ca\/index.php?rest_route=\/wp\/v2\/pages\/2666\/revisions\/2674"}],"wp:attachment":[{"href":"https:\/\/dr-nutrition.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}