So one time i was snowed in under 4 feet of snow and the power went out. Thankfully i had a stove to heat water but damn if the bed wasn't a block of ice. So i came up with this lil fix. All you need is a stainless steel water bottle with a screw top, a sports sock and a source of warm water.
For safety i recommend using a second gromit on the top to ensure a good seal, some cheaper bottles gromits perish or snap under heat and the thread of the screw sometimes stops short of a secure seal. Also use a wide mouth bottle for ease of filling.
Place the bottle in the bottom of the sock and roll the end back down over the body to expose the top. Now 3/4 fill with hot water (I personally use boiling water as i like my feet really warm) using the sock as protection from the instantly hot sides. Pour water in slowly, the wide mouth helps here, as the water might try to escape as it replaces the air inside.
Wait around a minute before attaching the lid to let some of the steam escape, you don't want the lid popping off while its under your blankets! In fact, first time you use a new bottle, i would leave it upside down in a sink to test the seal, you don't want boiling water on your bed or feet. Similarly do not over tighten the lid as the plastic threads can jump and become looser.
Now tie to top of sock to ensure the metal inside will not come into contact with your precious bits under the covers.
Improvements I've made since the Mk I:
I use a 1 liter bottle right now but a 1.5 liter bottle will stay warm for over 7 hours.
Using a thermal sock seems to improve the length of warm time and reduces the overall heat.
Use good quality bottles for a good secure screw top. (I got mine at Home Bargins for 2 quid)