func RetrieveGeoNamesTimezone(latitude float64, longitude float64, userName string) (geoNamesTimezone *GeoNamesTimezone, err error) {
	defer catchPanic(&err)
	uri := fmt.Sprintf(geonamesURI, latitude, longitude, userName)
	resp, err := http.Get(uri)
	if err != nil {
		return geoNamesTimezone, err
	}
	defer resp.Body.Close()
	rawDocument, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return geoNamesTimezone, err
	}
	if err = json.Unmarshal(rawDocument, &geoNamesTimezone); err != nil {
		return geoNamesTimezone, err
	}
	if len(geoNamesTimezone.TimezoneID) == 0 {
		return geoNamesTimezone, fmt.Errorf("Error : No Timezone ID Provided")
	}
	return geoNamesTimezone, err
}
RetrieveGeoNamesTimezone calls the GeoNames API to retrieve the timezone for the lat/lng.
package timezone
import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"time"
)
const (
	googleURI   string = "https://maps.googleapis.com/maps/api/timezone/json?location=%f,%f&timestamp=%d&sensor=false"
	geonamesURI string = "http://api.geonames.org/timezoneJSON?lat=%f&lng=%f&username=%s"
)
type (
	GoogleTimezone struct {
		DstOffset    float64 `bson:"dstOffset"`     
		RawOffset    float64 `bson:"rawOffset"`     
		Status       string  `bson:"status"`        
		TimezoneID   string  `bson:"timeZoneID"`    
		TimezoneName string  `bson:"timeZoneName"`  
	}
	GeoNamesTimezone struct {
		Time        string  `bson:"time"`         
		CountryName string  `bson:"countryName"`  
		CountryCode string  `bson:"countryCode"`  
		Sunset      string  `bson:"sunset"`       
		RawOffset   float64 `bson:"rawOffset"`    
		DstOffset   float64 `bson:"dstOffset"`    
		GmtOffset   float64 `bson:"gmtOffset"`    
		Sunrise     string  `bson:"sunrise"`      
		TimezoneID  string  `bson:"timezoneID"`   
		Longitude   float64 `bson:"lng"`          
		Latitude    float64 `bson:"lat"`          
	}
)
func RetrieveGoogleTimezone(latitude float64, longitude float64) (googleTimezone *GoogleTimezone, err error) {
	defer catchPanic(&err)
	uri := fmt.Sprintf(googleURI, latitude, longitude, time.Now().UTC().Unix())
	resp, err := http.Get(uri)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	rawDocument, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}
	if err = json.Unmarshal(rawDocument, &googleTimezone); err != nil {
		return nil, err
	}
	if googleTimezone.Status != "OK" {
		return nil, fmt.Errorf("Error : Google Status : %s", googleTimezone.Status)
	}
	if len(googleTimezone.TimezoneID) == 0 {
		return nil, fmt.Errorf("Error : No Timezone ID Provided")
	}
	return googleTimezone, err
}