{"id":287,"date":"2024-02-04T22:05:04","date_gmt":"2024-02-04T22:05:04","guid":{"rendered":"https:\/\/runcalendar.com.au\/blog\/?page_id=287"},"modified":"2026-01-07T02:19:51","modified_gmt":"2026-01-07T02:19:51","slug":"pace-calculator","status":"publish","type":"page","link":"https:\/\/runcalendar.com.au\/blog\/pace-calculator","title":{"rendered":"Race Pace Calculator"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Find the exact pace you need to smash your running goals<\/h3>\n\n\n\n<p>Planning for a specific finish time? Use our calculator to break down your target into manageable splits. Whether you\u2019re chasing a sub-20 minute 5km or tackling your first ultramarathon, knowing your numbers is the first step to crossing the finish line.<\/p>\n\n\n\n<div id=\"app\">\n<label for=\"distance\">Select Distance:<\/label>\n<select id=\"distance\" v-model=\"selectedDistance\" @change=\"adjustSliderRange\" style=\"width:400px\">\n<option value=\"50\">50km<\/option>\n<option value=\"42.2\">Marathon (42.2 km)<\/option>\n<option value=\"21.1\">Half Marathon (21.1 km)<\/option>\n<option value=\"10\">10 km<\/option>\n<option value=\"5\">5 km<\/option>\n<\/select>\n<label for=\"time\">Target time:<\/label>\n<input type=\"range\" id=\"time\" :min=\"minSliderValue\" :max=\"maxSliderValue\" :step=\"sliderStep\" v-model=\"selectedTime\" @input=\"calculatePace\"  style=\"width:400px; margin-bottom: 40px\" \/>\n<span>{{ formatTime(selectedTime) }}<\/span><br>\n<button @click=\"calculatePace\">Calculate Pace<\/button>\n<p v-if=\"overallPace\">Required pace: {{ overallPace }}<\/p>\n<div v-if=\"paceList.length\">\n<table v-if=\"paceList.length\" style=\"width: 250px\">\n<thead>\n<tr>\n<th  style=\"text-align: right\">KM<\/th>\n<th  style=\"text-align: right\">Elapsed Time<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr v-for=\"(pace, index) in paceList\" :key=\"index\" :class=\"{ &#39;even-row&#39;: index % 2 === 0 }\">\n<td style=\"text-align: right\">{{ pace.distance }}<\/td>\n<td style=\"text-align: right\">{{ pace.elapsedTime }}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/vue@2\"><\/script>\n<script>\n        new Vue({\n            el: '#app',\n            data: {\n                selectedDistance: '42.2',\n                selectedTime: 210,\n                paceList: [],\n                overallPace: '',\n                distanceRanges: {\n                    '42.2': { min: 150, max: 400, step: 2 },\n                    '21.1': { min: 75, max: 200, step: 0.5 },\n                    '10': { min: 20, max: 90, step: 0.25 },\n                    '5': { min: 10, max: 45, step: 0.01 },\n                },\n                minSliderValue: 150,\n                maxSliderValue: 400,\n                sliderStep: 1\n            },\n             methods: {\n                formatTime(minutes) {\n                    const hours = Math.floor(minutes \/ 60);\n                    const mins = Math.floor(minutes % 60);\n                    const seconds = Math.round((minutes * 60) % 60);\n                    return `${String(hours).padStart(1, '0')}:${String(mins).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n                },\n\ncalculatePace() {\n    const totalMinutes = this.selectedTime;\n    const distance = parseFloat(this.selectedDistance);\n\n    if (isNaN(distance) || distance <= 0) {\n        console.error('Invalid distance selected');\n        return;\n    }\n\n    this.paceList = []; \/\/ Clear the previous pace list\n\n    const isNonWholeNumber = distance % 1 !== 0;\n    const loopCount = Math.floor(distance);\n\n    for (let i = 1; i <= loopCount; i++) {\n        const currentDistance = i;\n\n        const elapsedMinutes = Math.floor(totalMinutes \/ distance * currentDistance);\n        const elapsedHours = Math.floor(elapsedMinutes \/ 60);\n        const remainingMinutes = elapsedMinutes % 60;\n        const elapsedSeconds = Math.round((totalMinutes \/ distance * currentDistance - elapsedMinutes) * 60);\n\n        this.paceList.push({\n            distance: currentDistance.toFixed(0),\n            elapsedTime: `${String(elapsedHours).padStart(2, '0')}:${String(remainingMinutes).padStart(2, '0')}:${String(elapsedSeconds).padStart(2, '0')}`,\n        });\n    }\n\n\/\/ Output the last row if the distance is not a whole number\nif (isNonWholeNumber) {\n    const currentDistance = distance;\n\n    const elapsedMinutesFinal = Math.floor(totalMinutes \/ distance * currentDistance);\n    const elapsedHoursFinal = Math.floor(elapsedMinutesFinal \/ 60);\n    const remainingMinutesFinal = elapsedMinutesFinal % 60;\n    const elapsedSecondsFinal = Math.round((totalMinutes \/ distance * currentDistance - elapsedMinutesFinal) * 60);\n\n    \/\/ Ensure correct formatting for seconds\n    const formattedSecondsFinal = elapsedSecondsFinal < 10 ? `0${elapsedSecondsFinal}` : elapsedSecondsFinal;\n\n    this.paceList.push({\n        distance: currentDistance.toFixed(1),\n        elapsedTime: `${String(elapsedHoursFinal).padStart(2, '0')}:${String(remainingMinutesFinal).padStart(2, '0')}:${formattedSecondsFinal}`,\n    });\n}\n    \/\/ Calculate overall pace in m:ss\/km\n    const overallPaceMinutes = Math.floor(totalMinutes \/ distance);\n    const overallPaceSeconds = Math.round((totalMinutes \/ distance - overallPaceMinutes) * 60);\n\n    this.overallPace = `${overallPaceMinutes}:${String(overallPaceSeconds).padStart(2, '0')}\/km`;\n},\n\n\n\n\n\n                adjustSliderRange() {\n                    const distance = this.selectedDistance;\n\n                    if (distance in this.distanceRanges) {\n                        this.minSliderValue = this.distanceRanges[distance].min;\n                        this.maxSliderValue = this.distanceRanges[distance].max;\n                        this.sliderStep = this.distanceRanges[distance].step;\n\n                        \/\/ Adjust selected time if it's outside the new range\n                        if (this.selectedTime < this.minSliderValue) {\n                            this.selectedTime = this.minSliderValue;\n                        } else if (this.selectedTime > this.maxSliderValue) {\n                            this.selectedTime = this.maxSliderValue;\n                        }\n                    }\n                }\n            }\n        });\n    <\/script>\n\n\n\n<p><strong>Planning Your Strategy<\/strong> This tool calculates a steady, &#8220;even split&#8221; pace. While this is the most efficient way to run, many athletes use different strategies:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Positive Splits:<\/strong> Starting faster to &#8220;put time in the bank&#8221; (risky, but common).<\/li>\n\n\n\n<li><strong>Negative Splits:<\/strong> Starting conservatively and finishing faster (often the secret to a Personal Best).<\/li>\n<\/ul>\n\n\n\n<p>Use these splits as a baseline and adjust based on the course elevation and your fitness levels.<\/p>\n","protected":false},"excerpt":{"rendered":"<h3 class=\"wp-block-heading\">Find the exact pace you need to smash your running goals<\/h3>\n<p>Planning for a specific finish time? Use our calculator to break down your target into manageable splits. Whether you\u2019re chasing a sub-20 minute 5km or tackling your first ultramarathon, knowing your numbers is the first step to crossing the finish line.<\/p>\n<div id=\"app\">\n<label for=\"distance\">Select Distance:<\/label><br \/>\n<select id=\"distance\" v-model=\"selectedDistance\" @change=\"adjustSliderRange\" style=\"width:400px\"><option value=\"50\">50km<\/option><option value=\"42.2\">Marathon (42.2 km)<\/option><option value=\"21.1\">Half Marathon (21.1 km)<\/option><option value=\"10\">10 km<\/option><option value=\"5\">5 km<\/option><\/select><br \/>\n<label for=\"time\">Target time:<\/label><br \/>\n<input type=\"range\" id=\"time\" :min=\"minSliderValue\" :max=\"maxSliderValue\" :step=\"sliderStep\" v-model=\"selectedTime\" @input=\"calculatePace\"  style=\"width:400px; margin-bottom: 40px\" \/><br \/>\n<span>{{ formatTime(selectedTime) }}<\/span><br \/>\n<button @click=\"calculatePace\">Calculate Pace<\/button><\/p>\n<p v-if=\"overallPace\">Required pace: {{ overallPace }}<\/p>\n<div v-if=\"paceList.length\">\n<table v-if=\"paceList.length\" style=\"width: 250px\">\n<thead>\n<tr>\n<th  style=\"text-align: right\">KM<\/th>\n<th  style=\"text-align: right\">Elapsed Time<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr v-for=\"(pace, index) in paceList\" :key=\"index\" :class=\"{ &#39;even-row&#39;: index % 2 === 0 }\">\n<td style=\"text-align: right\">{{ pace.distance }}<\/td>\n<td style=\"text-align: right\">{{ pace.elapsedTime }}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><script src=\"https:\/\/cdn.jsdelivr.net\/npm\/vue@2\"><\/script><br \/>\n<script>\n        new Vue({\n            el: '#app',\n            data: {\n                selectedDistance: '42.2',\n                selectedTime: 210,\n                paceList: [],\n                overallPace: '',\n                distanceRanges: {\n                    '42.2': { min: 150, max: 400, step: 2 },\n                    '21.1': { min: 75, max: 200, step: 0.5 },\n                    '10': { min: 20, max: 90, step: 0.25 },\n                    '5': { min: 10, max: 45, step: 0.01 },\n                },\n                minSliderValue: 150,\n                maxSliderValue: 400,\n                sliderStep: 1\n            },\n             methods: {\n                formatTime(minutes) {\n                    const hours = Math.floor(minutes \/ 60);\n                    const mins = Math.floor(minutes % 60);\n                    const seconds = Math.round((minutes * 60) % 60);\n                    return `${String(hours).padStart(1, '0')}:${String(mins).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n                },<\/p>\n<p>calculatePace() {\n    const totalMinutes = this.selectedTime;\n    const distance = parseFloat(this.selectedDistance);<\/p>\n<p>    if (isNaN(distance) || distance <= 0) {\n        console.error('Invalid distance selected');\n        return;\n    }\n\n    this.paceList = []; \/\/ Clear the previous pace list\n\n    const isNonWholeNumber = distance % 1 !== 0;\n    const loopCount = Math.floor(distance);\n\n    for (let i = 1; i <= loopCount; i++) {\n        const currentDistance = i;\n\n        const elapsedMinutes = Math.floor(totalMinutes \/ distance * currentDistance);\n        const elapsedHours = Math.floor(elapsedMinutes \/ 60);\n        const remainingMinutes = elapsedMinutes % 60;\n        const elapsedSeconds = Math.round((totalMinutes \/ distance * currentDistance - elapsedMinutes) * 60);\n\n        this.paceList.push({\n            distance: currentDistance.toFixed(0),\n            elapsedTime: `${String(elapsedHours).padStart(2, '0')}:${String(remainingMinutes).padStart(2, '0')}:${String(elapsedSeconds).padStart(2, '0')}`,\n        });\n    }\n\n\/\/ Output the last row if the distance is not a whole number\nif (isNonWholeNumber) {\n    const currentDistance = distance;\n\n    const elapsedMinutesFinal = Math.floor(totalMinutes \/ distance * currentDistance);\n    const elapsedHoursFinal = Math.floor(elapsedMinutesFinal \/ 60);\n    const remainingMinutesFinal = elapsedMinutesFinal % 60;\n    const elapsedSecondsFinal = Math.round((totalMinutes \/ distance * currentDistance - elapsedMinutesFinal) * 60);\n\n    \/\/ Ensure correct formatting for seconds\n    const formattedSecondsFinal = elapsedSecondsFinal < 10 ? `0${elapsedSecondsFinal}` : elapsedSecondsFinal;\n\n    this.paceList.push({\n        distance: currentDistance.toFixed(1),\n        elapsedTime: `${String(elapsedHoursFinal).padStart(2, '0')}:${String(remainingMinutesFinal).padStart(2, '0')}:${formattedSecondsFinal}`,\n    });\n}\n    \/\/ Calculate overall pace in m:ss\/km\n    const overallPaceMinutes = Math.floor(totalMinutes \/ distance);\n    const overallPaceSeconds = Math.round((totalMinutes \/ distance - overallPaceMinutes) * 60);\n\n    this.overallPace = `${overallPaceMinutes}:${String(overallPaceSeconds).padStart(2, '0')}\/km`;\n},\n\n\n\n\n\n                adjustSliderRange() {\n                    const distance = this.selectedDistance;\n\n                    if (distance in this.distanceRanges) {\n                        this.minSliderValue = this.distanceRanges[distance].min;\n                        this.maxSliderValue = this.distanceRanges[distance].max;\n                        this.sliderStep = this.distanceRanges[distance].step;\n\n                        \/\/ Adjust selected time if it's outside the new range\n                        if (this.selectedTime < this.minSliderValue) {\n                            this.selectedTime = this.minSliderValue;\n                        } else if (this.selectedTime > this.maxSliderValue) {\n                            this.selectedTime = this.maxSliderValue;\n                        }\n                    }\n                }\n            }\n        });\n    <\/script><\/p>\n<p><strong>Planning Your Strategy<\/strong> This tool calculates a steady, &#8220;even split&#8221; pace.<br \/><a href=\"https:\/\/runcalendar.com.au\/blog\/pace-calculator\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":334,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"class_list":["post-287","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/runcalendar.com.au\/blog\/wp-json\/wp\/v2\/pages\/287","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/runcalendar.com.au\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/runcalendar.com.au\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/runcalendar.com.au\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/runcalendar.com.au\/blog\/wp-json\/wp\/v2\/comments?post=287"}],"version-history":[{"count":35,"href":"https:\/\/runcalendar.com.au\/blog\/wp-json\/wp\/v2\/pages\/287\/revisions"}],"predecessor-version":[{"id":517,"href":"https:\/\/runcalendar.com.au\/blog\/wp-json\/wp\/v2\/pages\/287\/revisions\/517"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/runcalendar.com.au\/blog\/wp-json\/wp\/v2\/media\/334"}],"wp:attachment":[{"href":"https:\/\/runcalendar.com.au\/blog\/wp-json\/wp\/v2\/media?parent=287"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}