source

사용자의 로케일 형식 및 시간 오프셋으로 날짜/시간 표시

manycodes 2023. 9. 3. 16:23
반응형

사용자의 로케일 형식 및 시간 오프셋으로 날짜/시간 표시

나는 서버가 HTML에서 항상 UTC로 날짜를 제공하고 클라이언트 사이트의 JavaScript가 사용자의 로컬 표준 시간대로 변환하도록 하기를 원합니다.

사용자의 로케일 날짜 형식으로 출력할 수 있다면 보너스입니다.

UTC 날짜를 입니다.Date이의를 제기하고 사용합니다.setUTC…원하는 날짜/시간으로 설정할 수 있습니다.

에 여러 가 있습니다.toLocale…String메소드는 현지화된 출력을 제공합니다.

예:

// This would come from the server.
// Also, this whole block could probably be made into an mktime function.
// All very bare here for quick grasping.
d = new Date();
d.setUTCFullYear(2004);
d.setUTCMonth(1);
d.setUTCDate(29);
d.setUTCHours(2);
d.setUTCMinutes(45);
d.setUTCSeconds(26);

console.log(d);                        // -> Sat Feb 28 2004 23:45:26 GMT-0300 (BRT)
console.log(d.toLocaleString());       // -> Sat Feb 28 23:45:26 2004
console.log(d.toLocaleDateString());   // -> 02/28/2004
console.log(d.toLocaleTimeString());   // -> 23:45:26

일부 참조:

moment.js(2021년에 폐지됨)로 할 수 있습니다.

다음과 같이 UTC에서 날짜 문자열을 구문 분석하는 이 가장 좋습니다(모든 브라우저에서 일관된 결과를 얻으려면 서버에 ISO-8601 호환 문자열을 작성하십시오).

var m = moment("2013-02-08T09:30:26Z");

이제 사용하기만 하면 됩니다.m응용 프로그램에서 moment.js는 기본적으로 디스플레이 작업을 위한 로컬 표준 시간대로 설정됩니다.날짜시간 값의 형식을 지정하거나 값의 일부를 추출하는 방법은 여러 가지가 있습니다.

다음과 같은 사용자 로케일에서 모멘트 개체를 포맷할 수도 있습니다.

m.format('LLL') // Returns "February 8 2013 8:30 AM" on en-us

moment.js 개체를 다른 표준 시간대(즉, 로컬 시간대 또는 UTC 시간대)로 변환하려면 moment.js 표준 시간대 확장이 필요합니다.이 페이지에는 몇 가지 예가 나와 있습니다. 사용하기가 매우 간단합니다.

참고: Moment JS는 보다 현대적인 대안을 추천하므로, 새로운 프로젝트에 적합하지 않을 수 있습니다.

사용할 수 있습니다.new Date().getTimezoneOffset()/60시간대별로또한 다음이 있습니다.toLocaleString()사용자의 로케일을 사용하여 날짜를 표시하는 방법입니다.

전체 목록은 다음과 같습니다.날짜 작업

JS에서는 위에서 언급한 것처럼 각 속성을 변환하는 것 외에 로컬 날짜 시간을 형식화할 수 있는 단순하고 교차적인 플랫폼 방법이 없습니다.

여기에 로컬 YYY-MM-DD를 얻기 위해 사용하는 빠른 해킹이 있습니다.최종 날짜가 더 이상 올바른 표준 시간대를 갖지 않으므로(따라서 표준 시간대를 무시해야 함) 이것은 해킹입니다.더 필요한 것이 있으면 moment.js를 사용합니다.

var d = new Date();    
d = new Date(d.getTime() - d.getTimezoneOffset() * 60000)
var yyyymmdd = t.toISOString().slice(0, 10); 
// 2017-05-09T08:24:26.581Z (but this is not UTC)

d.getTimezoneOffset()은 시간대 오프셋을 분 단위로 반환하며, d.getTime()은 밀리초 단위이므로 x 60,000입니다.

2021 - 브라우저 네이티브를 사용할 수 있습니다. Intl.Date 시간 형식

const utcDate = new Date(Date.UTC(2020, 11, 20, 3, 23, 16, 738));
console.log(new Intl.DateTimeFormat().format(utcDate));
// expected output: "21/04/2021", my locale is Switzerland

다음은 설명서의 직접적인 내용입니다.

const date = new Date(Date.UTC(2020, 11, 20, 3, 23, 16, 738));
// Results below assume UTC timezone - your results may vary

// Specify default date formatting for language (locale)
console.log(new Intl.DateTimeFormat('en-US').format(date));
// expected output: "12/20/2020"
    
// Specify default date formatting for language with a fallback language (in this case Indonesian)
console.log(new Intl.DateTimeFormat(['ban', 'id']).format(date));
// expected output: "20/12/2020"
    
// Specify date and time format using "style" options (i.e. full, long, medium, short)
console.log(new Intl.DateTimeFormat('en-GB', { dateStyle: 'full', timeStyle: 'long' }).format(date));
// Expected output "Sunday, 20 December 2020 at 14:23:16 GMT+11"

날짜 개체를 구성한 후에는 변환에 대한 일부 정보를 제공합니다.

함수는 UTC 형식의 Date 개체와 형식 문자열을 사용합니다.
당신은 필요할 것입니다.Date.strftime 파일

function UTCToLocalTimeString(d, format) {
    if (timeOffsetInHours == null) {
        timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1);
    }
    d.setHours(d.getHours() + timeOffsetInHours);

    return d.strftime(format);
}

// new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]])
var serverDate = new Date(2018, 5, 30, 19, 13, 15); // just any date that comes from server
var serverDateStr = serverDate.toLocaleString("en-US", {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
})
var userDate = new Date(serverDateStr + " UTC");
var locale = window.navigator.userLanguage || window.navigator.language;

var clientDateStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric'
});

var clientDateTimeStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
});

console.log("Server UTC date: " + serverDateStr);
console.log("User's local date: " + clientDateStr);
console.log("User's local date&time: " + clientDateTimeStr);

이전 프로젝트에서 사용한 내용은 다음과 같습니다.

var myDate = new Date();
var tzo = (myDate.getTimezoneOffset()/60)*(-1);
//get server date value here, the parseInvariant is from MS Ajax, you would need to do something similar on your own
myDate = new Date.parseInvariant('<%=DataCurrentDate%>', 'yyyyMMdd hh:mm:ss');
myDate.setHours(myDate.getHours() + tzo);
//here you would have to get a handle to your span / div to set.  again, I'm using MS Ajax's $get
var dateSpn = $get('dataDate');
dateSpn.innerHTML = myDate.localeFormat('F');

PHP 코드의 날짜로 저는 이런 것을 사용했습니다.

function getLocalDate(php_date) {
  var dt = new Date(php_date);
  var minutes = dt.getTimezoneOffset();
  dt = new Date(dt.getTime() + minutes*60000);
  return dt;
}

우리는 이렇게 부를 수 있습니다.

var localdateObj = getLocalDate('2015-09-25T02:57:46');

사용자의 로컬 표준 시간대 형식으로 db의 날짜 시간 문자열을 표시하기 위해 잠시 동안 모두 읽고 추가 조사해야 했기 때문에 지금까지의 답변을 섞어 추가합니다.

datetime 문자열은 다음 형식의 python/djangoddb에서 가져옵니다. 2016-12-05T15:12:24.215Z

JavaScript에서 브라우저 언어를 안정적으로 탐지하는 것이 모든 브라우저에서 작동하는 것은 아닌 것 같습니다(브라우저 언어 선호도 탐지는 JavaScript 참조). 그래서 저는 서버에서 브라우저 언어를 얻습니다.

Python/Django: 컨텍스트 매개 변수로 요청 브라우저 언어 전송:

language = request.META.get('HTTP_ACCEPT_LANGUAGE')
return render(request, 'cssexy/index.html', { "language": language })

HTML: 숨겨진 입력에 기록:

<input type="hidden" id="browserlanguage" value={{ language }}/>

JavaScript: 숨겨진 입력 값(예: en-GB, en-US;q=0.8, en;q=0.6/)을 가져온 다음 바꾸기 및 정규식을 통해서만 목록의 첫 번째 언어를 사용합니다.

const browserlanguage = document.getElementById("browserlanguage").value;
var defaultlang = browserlanguage.replace(/(\w{2}\-\w{2}),.*/, "$1");

JavaScript: datetime으로 변환하고 포맷:

var options = { hour: "2-digit", minute: "2-digit" };
var dt = (new Date(str)).toLocaleDateString(defaultlang, options);

참조: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

결과는 (브라우저 언어는 en-gb): 2016년 5월 12일, 14:58

.getTimezoneOffset()오프셋을 분하며, GMT/UTC 시간대의 " 음수가 를 들어, 시간은 + +됩니다) method GMT/UTC는 "method"의 "westwards"입니다. 뉴욕 시간은 +240분 또는 +4시간으로 보고됨)

일반 시간대 오프셋을 시간 단위로 가져오려면 다음을 사용해야 합니다.

var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60

중요한 세부 정보:
일광 절약 시간은 결과에 반영되므로 이 방법을 사용하면 실제 지리적 시간대 오프셋이 아니라 실제로 시간 오프셋이 제공됩니다.

제가 찾은 가장 좋은 해결책은 [time display="lll" datetime="UTC TIME" /] 태그를 지정하고 javascript(jquery)를 사용하여 사용자의 시간을 기준으로 구문 분석 및 표시합니다.

http://momentjs.com/ Moment.js

시간이 잘 표시됩니다.

다음을 사용하여 GMT의 시간대 오프셋을 분 단위로 보고할 수 있습니다.

new Date().getTimezoneOffset();

참고: - 이 함수는 음수를 반환합니다.

getTimeZoneOffset() 및 toLocalString은 기본 날짜 작업에 적합하지만, 실시간 시간대 지원이 필요한 경우 mde의 TimeZone.js를 확인하십시오.

질문에 대한 답변에는 몇 가지 옵션이 더 논의됩니다.

날짜를 로컬 날짜로 변환하려면 LocalDateString() 메서드로 사용합니다.

var date = (new Date(str)).toLocaleDateString(defaultlang, options);

시간을 현지 시간으로 변환하려면 LocalTimeString() 메서드로 사용합니다.

var time = (new Date(str)).toLocaleTimeString(defaultlang, options);

아주 오래된 질문이지만 아마도 이것은 누군가가 이것에 비틀거리는 것을 도울 것입니다.아래 코드 형식은 사용자의 시간대 및 로케일에 해당하는 사용자 친화적인 형식의 ISO8601 날짜 문자열입니다.필요에 따라 조정합니다.예를 들어, 앱의 경우 1일, 1주, 1개월, 1년 이상의 날짜를 사용자에게 표시하는 데 시간, 분, 초가 중요합니까?

또한 응용 프로그램의 구현에 따라 주기적으로 다시 렌더링하는 것을 잊지 마십시오. (아래의 내 코드에서는 적어도 24시간마다 한 번씩)

export const humanFriendlyDateStr = (iso8601) => {

  // Examples (using Node.js):

  // Get an ISO8601 date string using Date()
  // > new Date()
  // 2022-04-08T22:05:18.595Z

  // If it was earlier today, just show the time:
  // > humanFriendlyDateStr('2022-04-08T22:05:18.595Z')
  // '3:05 PM'

  // If it was during the past week, add the day:
  // > humanFriendlyDateStr('2022-04-07T22:05:18.595Z')
  // 'Thu 3:05 PM'

  // If it was more than a week ago, add the date
  // > humanFriendlyDateStr('2022-03-07T22:05:18.595Z')
  // '3/7, 2:05 PM'

  // If it was more than a year ago add the year
  // > humanFriendlyDateStr('2021-03-07T22:05:18.595Z')
  // '3/7/2021, 2:05 PM'

  // If it's sometime in the future return the full date+time:
  // > humanFriendlyDateStr('2023-03-07T22:05:18.595Z')
  // '3/7/2023, 2:05 PM'

  const datetime = new Date(Date.parse(iso8601))
  const now = new Date()
  const ageInDays = (now - datetime) / 86400000
  let str

  // more than 1 year old?
  if (ageInDays > 365) {
    str = datetime.toLocaleDateString([], {
      year: 'numeric',
      month: 'numeric',
      day: 'numeric',
      hour: 'numeric',
      minute: 'numeric',
    })
    // more than 1 week old?
  } else if (ageInDays > 7) {
    str = datetime.toLocaleDateString([], {
      month: 'numeric',
      day: 'numeric',
      hour: 'numeric',
      minute: 'numeric',
    })
    // more than 1 day old?
  } else if (ageInDays > 1) {
    str = datetime.toLocaleDateString([], {
      weekday: 'short',
      hour: 'numeric',
      minute: 'numeric',
    })
    // some time today?
  } else if (ageInDays > 0) {
    str = datetime.toLocaleTimeString([], {
      timeStyle: 'short',
    })
    // in the future?
  } else {
    str = datetime.toLocaleDateString([], {
      year: 'numeric',
      month: 'numeric',
      day: 'numeric',
      hour: 'numeric',
      minute: 'numeric',
    })
  }
  return str
}

영감을 받은 출처: https://alexwlchan.net/2020/05/human-friendly-dates-in-javascript/

Node.js를 사용하여 테스트됨

저는 백엔드 데이터베이스에서 센서 데이터를 수신하고 자바스크립트를 사용하여 딥슬레이 및 차트 작성을 위해 이 정보를 처리하기 위해 라벨을 사용하고 있습니다.제가 변환할 때 사용한 접근 방식은 다음과 같습니다.created_at내 지역 시간대로 가는 시간.

...
success: function(response){
      $('#dht_data_table').html(""); //clear table data under silent table refresh
      $.each(response.dht_data, function(key, dhtdata){ // cycle through table fetching sensor data
        // convert data recorded time in local  format
        var dht_datatimestamp = new Date(dhtdata.created_at).toLocaleString("en-US", {
                              localeMatcher: "best fit",
                              timeZoneName: "short"
                            });
...
`dht_data` is the sensor data object from the database passed via jquery response in json format.

샘플 출력 결과는 다음과 같습니다.

7/3/2023, 12:38:27 PM GMT+3

가이드와 관련하여

로케일을 어떻게 하는지 모르지만 자바스크립트는 클라이언트 쪽 기술입니다.

usersLocalTime = new Date();

클라이언트의 시간 및 날짜가 표시됩니다(브라우저 및 사용자가 앉아 있는 컴퓨터에서 보고됨).응답에 서버의 시간을 포함하고 오프셋을 추측하기 위해 간단한 계산을 수행하는 것은 사소한 일입니다.

언급URL : https://stackoverflow.com/questions/85116/display-date-time-in-users-locale-format-and-time-offset

반응형