2014-12-25 14 views
9

È possibile rilevare se la macchina dell'utente utilizza 12 ore (am/pm) o 24 ore (militare tempo)?Rileva con javascript se la macchina dell'utente utilizza 12 ore (am/pm) o 24 ore (ora militare)

Un modo sarebbe quello di controllare gli utenti locali, ma poi è solo lista enorme di confronto locale e qualcuno dagli Stati Uniti che vuole 12 ore mi può inviare solo en locale, non US_en e non ho modo di sapere le sue preferenze . Allo stesso tempo, qualcuno degli Stati Uniti potrebbe impostare la sua macchina per utilizzare il formato 12 ore e non desidera un orologio di 12 ore.

EDIT:

date.toLocaleTimeString(); 

avrebbe funzionato è la teoria, come utente Mouser suggerito di seguito, ma purtroppo è bugged sul browser WebKit (testato su Chrome e il nuovo Opera su Windows) e per qualche motivo torna sempre am/pm tempo.

Esempio: http://jsfiddle.net/sjuaL3p4/

Quindi penso che devo riformulare la mia domanda se qualcuno ha un'idea di come realizzarlo sul browser WebKit anche.

+0

Volete sapere che cosa la preferenza utente è nel loro sistema operativo in modo che il codice del browser si comporta nello stesso modo in cui la preferenza del sistema operativo dell'utente ?? – Louis

+0

@Louis Sì, è esattamente quello che voglio. –

+0

Windows 7, Firefox 34.0.5; '.toLocaleTimeString()' mostra l'ora di 12 ore indipendentemente dalle mie impostazioni. – Hydrothermal

risposta

4

Questa soluzione funziona nella maggior parte dei browser, ma bug in Chrome.

var date = new Date(Date.UTC(2012, 11, 12, 3, 0, 0)); 
var dateString = date.toLocaleTimeString(); 

//apparently toLocaleTimeString() has a bug in Chrome. toString() however returns 12/24 hour formats. If one of two contains AM/PM execute 12 hour coding. 
if (dateString.match(/am|pm/i) || date.toString().match(/am|pm/i)) 
{ 
    //12 hour clock 
} 
else 
{ 
    //24 hour clock 
} 

Soluzione Chrome; A proof of concept

Questa è una brutta soluzione per Chrome. Annusa gli utenti country_code tramite reverse geolocation. Tale codice viene verificato su un array con paesi che utilizzano il sistema 12 ore. Questa soluzione è brutta perché è necessaria l'autorizzazione dell'utente per ottenere i dati di geolocalizzazione e, se le impostazioni locali degli utenti sono diverse, fornirà le informazioni sbagliate, ma fornirà il paese dell'utente. Mi sconsiglio vivamente di utilizzare questo esempio. È puramente a scopo di ispirazione. L'ho inventato come prova del concetto.

function getClockChrome() { 

    navigator.geolocation.getCurrentPosition(function(pos) { 
     var url = "http://nominatim.openstreetmap.org/reverse?format=json&lat="+pos.coords.latitude+"&lon="+pos.coords.longitude+"&addressdetails=1&accept-language=en_US&json_callback=chromeClockCallBack"; 
     var script = document.createElement('script'); 
     script.src = url; 
     document.body.appendChild(script); 
    }, 

    function() 
    { 
     //no access to location 
    }, 


    { 
     enableHighAccuracy: true, 
     timeout: 5000, 
     maximumAge: 0 
    } 
    ); 

} 

getClockChrome(); 

var dateCountryCode = ['US', 'GB', 'PH', 'CA', 'AU', 'NZ', 'IN', 'EG', 'SA', 'CO', 'PK', 'MY']; 
function chromeClockCallBack(data) 
{ 
    //Request succeeded 
    if (dateCountryCode.indexOf(data.address.country_code.toUpperCase()) > -1) 
    { 
     alert("12 hour clock"); 
    } 
    else 
    { 
     alert("24 hour clock"); 
    } 
} 
+0

http://jsfiddle.net/sjuaL3p4/ - Sto usando un orologio di 24 ore, ma il toLocaleTimeString restituisce comunque l'ora di AM/PM ... Penso che sia necessario specificare il locale che si desidera utilizzare ma che vanifica lo scopo. .. –

+0

Testato sulla mia macchina con le impostazioni dell'orologio a 24 ore e le impostazioni dell'orologio a 12 ore, ha mostrato il valore corretto. – Mouser

+0

Ok, è strano. Funziona per me in Firefox/IE, non in Chrome/Opera ... –

2

toLocaleTimeStringdovrebbe dare il tempo in un formato che riflette le preferenze dell'utente, ma è inaffidabile.

Sono su un sistema Debian. L'uscita del locale è:

LANG=en_US.utf8 
LANGUAGE= 
LC_CTYPE="en_US.utf8" 
LC_NUMERIC="en_US.utf8" 
LC_TIME="en_US.utf8" 
LC_COLLATE="en_US.utf8" 
LC_MONETARY="en_US.utf8" 
LC_MESSAGES="en_US.utf8" 
LC_PAPER="en_US.utf8" 
LC_NAME="en_US.utf8" 
LC_ADDRESS="en_US.utf8" 
LC_TELEPHONE="en_US.utf8" 
LC_MEASUREMENT="en_US.utf8" 
LC_IDENTIFICATION="en_US.utf8" 
LC_ALL= 

Ecco alcuni esperimenti con date:

$ date +%X 
05:23:32 PM 
$ LANG=en_GB date +%X 
17:24:06 
$ LC_TIME=en_GB date +%X 
17:24:22 

Il formato %X dice date per emettere il tempo in base alle impostazioni internazionali. I risultati sopra riportati sono esattamente come previsto. L'impostazione LC_TIME è un modo per modificare solo il formato dell'ora ma mantenere intatto tutto il resto del locale. Così qualcuno negli Stati Uniti potrebbe usare un formato ora 24 ore, anche se il valore predefinito per en_US è 12.

Ho provato Mouser's script sul mio sistema:

$ firefox --no-remote 
[Shows a time in the 12 hour format, as expected.] 
$ LANG=en_GB firefox --no-remote 
[Shows a time in the 24 hour format, as expected.] 

Fin qui tutto bene.Tuttavia,

$ LC_TIME=en_GB firefox --no-remote 
[Shows a time in the 12 hour format, this is wrong!] 

Ottengo gli stessi risultati con Chrome. Sembra che sia Firefox che Chrome ignorino lo LC_TIME.

0

Oltre al fatto che questo non dovrebbe mai essere eseguito, .toLocaleTimeString() non sarebbe una buona soluzione anche se funzionasse attraverso i browser. Restituisce una stringa temporale che segue il formato impostato dal computer dell'utente, ma è possibile avere un orologio a 24 ore che mostra ancora AM/PM, così come un orologio a 12 ore che non lo fa. Non è possibile rilevarlo in modo accurato o affidabile.

0

Questa linea semplice sembra funzionare per me.

var is24 = ((new Date(2014, 01, 01, 15, 0, 0, 0)).toLocaleTimeString().indexOf("15") > -1); 

Anche se ancora non funziona in Chrome (funziona in IE e Firefox)

Problemi correlati