ব্যবহারকারীর স্থানীয় ফর্ম্যাট এবং সময় অফসেটে তারিখ / সময় প্রদর্শন করুন


167

আমি চাই সার্ভারটি সর্বদা এইচটিএমএল-তে ইউটিসিতে তারিখগুলি পরিবেশন করে এবং ক্লায়েন্ট সাইটে জাভাস্ক্রিপ্ট ব্যবহারকারীর স্থানীয় সময় অঞ্চলে রূপান্তরিত করে।

বোনাস যদি আমি ব্যবহারকারীর স্থানীয় তারিখের ফর্ম্যাটে আউটপুট করতে পারি।

উত্তর:


165

ইউটিসি তারিখ দিয়ে শুরু করার সর্বাধিক বোকামি উপায় হ'ল একটি নতুন 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

কিছু তথ্যসূত্র:


1
ফায়ারফক্সে, toLocateDateString()এমন কিছু প্রত্যাবর্তন করবে যা দেখতে 'রবিবার, 12 জানুয়ারী, ২০১৪' এর মতো দেখাচ্ছে ..
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

1
হুঁ হ্যাঁ, এটি বেশ গুরুতর সমস্যা। আপনি ব্রাউজারগুলিতে একই তারিখটি দেখতে চাইলে এই পদ্ধতিগুলি ব্যবহার করা কার্যকর হবে না। কোন বিকল্প পরিচিত?
জোশ ম্যাক

6
উপরের আরম্ভের একক-লাইন সংস্করণ:var d = new Date(Date.UTC(2004,1,29,2,45,26));
এম 1kael

4
এটি বিবেচনা করার মতো বিষয় যে ক্রোম (ভি 35 হিসাবে) toLocaleString()ফাংশনগুলিতে ব্যবহারকারীর লোকেলকে বিবেচনা করে না ।
বেন্নো

8
আমি দুঃখিত, তবে এই পদ্ধতিটি (আমি অস্ট্রেলিয়ায় আছি) এর অধীনে কাজ করে না, যখন আমি উপরের কোডটি চালাই তখন তারিখটি মার্কিন ফর্ম্যাটে প্রদর্শিত হয়। উপরন্তু MDN বলছেন 'লোকেল ব্যবহার করা হয় এবং স্ট্রিং ফিরে আকারে সম্পূর্ণরূপে বাস্তবায়ন নির্ভরশীল।
tgrrr

65

নতুন প্রকল্পগুলির জন্য, কেবল moment.js ব্যবহার করুন

এই প্রশ্নটি বেশ পুরানো, সুতরাং moment.js সেই সময়ে উপস্থিত ছিল না, তবে নতুন প্রকল্পগুলির জন্য এটি এর মতো কাজগুলি অনেক সহজ করে দেয়।

ইউটিসি থেকে আপনার তারিখের স্ট্রিংটি নিম্নরূপে পার্স করা ভাল ( সমস্ত ব্রাউজারে সামঞ্জস্যপূর্ণ ফলাফল পেতে সার্ভারে একটি আইএসও -8601 সামঞ্জস্যপূর্ণ স্ট্রিং তৈরি করুন):

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

এখন কেবলমাত্র mআপনার অ্যাপ্লিকেশনে ব্যবহার করুন, মুহুর্ত.জেস ডিসপ্লে অপারেশনের জন্য স্থানীয় টাইমজোনকে ডিফল্ট করে। আছে তারিখ এবং সময় মান ফরম্যাট করতে নানাভাবে বা এর অংশ বের করে।

আপনি এমনকি ব্যবহারকারী লোকেলের মধ্যে একটি মুহুর্তের অবজেক্টটি এটির মতো বিন্যাস করতে পারেন:

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

একটি মুহুর্ত.জেএস অবজেক্টকে আলাদা টাইমজোনে রূপান্তর করতে (যেমন স্থানীয় বা ইউটিসি না উভয়ই নয়) আপনার মুহুর্তের জন্য টাইমজোন এক্সটেনশন প্রয়োজন । এই পৃষ্ঠায় কিছু উদাহরণ রয়েছে, এটি ব্যবহার করা বেশ সহজ।


আপনি এই সব একত্রিত কিভাবে? m.utcOffset (অফসেট)। ফর্ম্যাট ('এলএলএল') কাজ করছে বলে মনে হচ্ছে না।
বার্ট

উচিত Luxon বা Day.js প্রস্তাব গ্রন্থাগার এখন?
হোমার

1
আমি যোগ করার পরামর্শ দিচ্ছিFor old projects, just use jQuery
জেনোস

ক্রোমে কাজ করে না - কম্পিউটারের লোকাল সেটিংসে সময় 24 ঘন্টা নির্ধারণ করা সত্ত্বেও সকাল / সন্ধ্যা - টায় দেখায়
আমাদের ডেস্ক

20

আপনি new Date().getTimezoneOffset()/60সময় অঞ্চল জন্য ব্যবহার করতে পারেন । toLocaleString()ব্যবহারকারীর লোকেল ব্যবহার করে একটি তারিখ প্রদর্শন করার জন্য একটি পদ্ধতিও রয়েছে।

পুরো তালিকাটি এখানে: তারিখের সাথে কাজ করা


ব্যবহারকারীরা যে ফর্ম্যাটটির প্রত্যাশা করতে পারে সেই ফরমেটে তারিখ উপস্থাপনের জন্য টোকলস্ট্রস্ট্রিং অত্যন্ত বিশ্বাসযোগ্য নয়। এমনকি যেখানে আইএসও ৪০২ সমর্থিত, এটি এখনও খুব অবিশ্বাস্য এবং এক ভাষাতে বিন্যাসের ভিত্তি করে, স্থানীয় নয়।
রবজি 4

@ রবজি এর পরিবর্তে সমাধান কী toLocaleString?
ব্যবহারকারী 924

@ user924 — আপনি একটি লাইব্রেরি ব্যবহার করতে পারেন, বেছে নেওয়া প্রচুর পরিমাণে রয়েছে। সমস্যাটোকলাস্ট্রিংয়ের হ'ল বিভিন্ন বাস্তবায়ন বিভিন্ন ভাষা এবং অঞ্চলগুলির জন্য বিভিন্ন স্তরের সমর্থন সহ বিভিন্ন ফলাফল দেয়। উদাহরণস্বরূপ, আমার সিস্টেমের ডিফল্ট ভাষা এন-ইউএস নয় তবে কিছু ব্রাউজারের টোকল স্ট্রিংয়ের ডিফল্ট ফর্ম্যাটটি মার্কিন ফর্ম্যাট, অন্যরা আমার সিস্টেমের ভাষাকে সম্মান করে। টাইমজোন নামগুলির সাথে এটি একই রকম, কেবলমাত্র এগুলি খারাপ যেহেতু এগুলি একেবারেই মানসম্পন্ন হয় না। :-(
রবিজি

7

একবার আপনার তারিখের অবজেক্টটি তৈরি হয়ে গেলে, রূপান্তরটির জন্য এখানে একটি স্নিপেট রয়েছে:

ফাংশনটি একটি ইউটিসি ফর্ম্যাটেড তারিখ অবজেক্ট এবং ফর্ম্যাট স্ট্রিং নেয়।
আপনার একটি Date.strftimeপ্রোটোটাইপ লাগবে ।

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

    return d.strftime(format);
}

6
আপনি কোথা থেকে এসেছেন?
অনুজ পান্ডে

সময় নির্ধারণের তারিখের কোনও দিন / তারিখ / বছরের অংশগুলিতে কোনও প্রভাব আছে? মনে হয় না।
ক্রিস্টোকিউই

1
@ ChristoKiwi-টু পাস মান setHours একটি পূর্ণসংখ্যা হতে বলে আশা করা হচ্ছে getTimezoneOffset()/60ভগ্নাংশ আসতে পারে (: 30 5.5 ফিরে আসবে যেমন ভারত +05 অফসেট)। দশমিকগুলি কাটা হয়। অন্যথায়, ঘন্টা নির্ধারণ করা অন্যান্য মানগুলি আপডেট করে (ঘন্টাগুলিকে 48 এ সেট করে এবং কী ঘটে তা দেখুন)।
রবিজি

7

উপরে বর্ণিত প্রতিটি সম্পত্তি রূপান্তর করার বাইরে জেএসে স্থানীয় তারিখের সময় বিন্যাস করার জন্য কোনও সহজ এবং ক্রস প্ল্যাটফর্ম উপায় নেই।

স্থানীয় ওয়াইওয়াইওয়াই-এমএম-ডিডি পেতে আমি এখানে একটি দ্রুত হ্যাক ব্যবহার করি। দ্রষ্টব্য যে এটি একটি হ্যাক, কারণ চূড়ান্ত তারিখটিতে সঠিক সময় অঞ্চল আর থাকবে না (তাই আপনাকে টাইমজোনটি উপেক্ষা করতে হবে)। আমার যদি আরও কিছু প্রয়োজন হয় তবে আমি moment.js ব্যবহার করি।

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

D.getTimezoneOffset () টাইম অঞ্চলটি অফসেটটি কয়েক মিনিটের মধ্যে ফেরত দেয় এবং d.getTime () এমএসে থাকে, সুতরাং x 60,000।


1
@VG আমি 60k কোথা থেকে আসে সে সম্পর্কে আরও কিছু তথ্য যুক্ত করেছি। এই সাহায্য আশা করি।
জেরেমি

5

বিগত প্রকল্পগুলিতে আমি যা ব্যবহার করেছি তা এখানে:

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');

4
এটি এএসপি.এনইটি-নির্দিষ্ট স্টাফ সহ।
ZiggyTheHamster

টাইমজোন অফসেটগুলি অগত্যা এক ঘণ্টারও গুণক হয় না, তাই getTimezoneOffset()/60প্রায়শই দশমিক মান ফিরে আসবে। এটি বিশেষত ১৯০০ সালের তারিখের জন্য সত্য যেখানে অনেক জায়গাতেই মিনিট এবং সেকেন্ডে অফসেট ছিল। এছাড়াও, জাভাস্ক্রিপ্ট তারিখগুলি এখন historicalতিহাসিক অফসেটগুলি সমর্থন করার জন্য প্রয়োজনীয়। যেমন 1890 সালে মস্কোর অফসেটটি ছিল +2: 30: 17। দেখুন ব্রাউজার, সময় অঞ্চল, ক্রোম 67 ত্রুটি
রবজি

3

দ্য .getTimezoneOffset()পদ্ধতি সময় অঞ্চল জিএমটি / ইউটিসি সময় অঞ্চল থেকে মিনিট, কাউন্টিং "পশ্চিমদিকে" এ অফসেট রিপোর্ট, একটি অফসেট মান এক সাধারণভাবে অভ্যস্ত হয় কি নেতিবাচক যে ফলে। (উদাহরণস্বরূপ, নিউ ইয়র্কের সময়টি +240 মিনিট বা +4 ঘন্টা হবে বলে জানানো হবে)

কয়েক ঘন্টা মধ্যে একটি সাধারণ সময়-অঞ্চল অফসেট পেতে, আপনি ব্যবহার করতে হবে:

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

গুরুত্বপূর্ণ বিশদ:
নোট করুন যে দিবালোকের সঞ্চয়ের সময়টি ফলাফলের সাথে সজ্জিত হয় - সুতরাং এই পদ্ধতিটি আপনাকে যা দেয় তা সত্যই সময়ের অফসেট - প্রকৃত ভৌগলিক সময়-অঞ্চল অফসেট নয়।


3

পিএইচপি কোড থেকে তারিখের সাথে আমি এই জাতীয় কিছু ব্যবহার করেছি ..

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');

প্রশ্নটি পিএইচপি নয়, জাভাস্ক্রিপ্ট সম্পর্কে ছিল।
পাইপড্রিমবম্ব

5
উত্তরটি কেবল জাভাস্ক্রিপ্টে রয়েছে, প্রশ্নের মধ্যে উল্লেখ করা হয়েছে যে সার্ভারের তারিখটি ইউটিসিতে রয়েছে। সুতরাং সার্ভার যে কোনও ভাষায় হতে পারে। সুতরাং আমি কেবল পিএইচপি-র উত্তর দিয়েছি
hriziya

3

আমি এখন পর্যন্ত উত্তরগুলি মিশ্রিত করেছি এবং এটিতে যুক্ত করছি, কারণ ব্যবহারকারীর স্থানীয় সময় অঞ্চল বিন্যাসে ডিবি থেকে তারিখের সময়ের স্ট্রিংটি প্রদর্শন করতে আমাকে এগুলি সমস্ত পড়তে এবং অতিরিক্তভাবে তদন্ত করতে হয়েছিল।

ডেটটাইম স্ট্রিংটি পাইথন / জ্যাঙ্গো ডিবি ফর্ম্যাটে আসে: 2016-12-05T15: 12: 24.215Z

জাভাস্ক্রিপ্টে ব্রাউজার ভাষার নির্ভরযোগ্য সনাক্তকরণ সমস্ত ব্রাউজারে কাজ করছে বলে মনে হচ্ছে না ( ব্রাউজারের ভাষা পছন্দ সনাক্তকরণের জন্য জাভাস্ক্রিপ্ট দেখুন ), তাই আমি সার্ভার থেকে ব্রাউজারের ভাষা পাই।

পাইথন / জাঙ্গো: প্রসঙ্গের প্যারামিটার হিসাবে অনুরোধ ব্রাউজারের ভাষা প্রেরণ করুন:

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

এইচটিএমএল: এটি একটি লুকানো ইনপুটটিতে লিখুন:

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

জাভাস্ক্রিপ্ট: লুকানো ইনপুট এর মান পান যেমন এন-জিবি, এন-ইউএস; কিউ = 0.8, এন; কি = 0.6 / এবং তারপরে তালিকার প্রথম ভাষাটি কেবল প্রতিস্থাপন এবং নিয়মিত এক্সপ্রেশনের মাধ্যমে গ্রহণ করুন

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

জাভাস্ক্রিপ্ট: ডেটটাইমে রূপান্তর করুন এবং এটি ফর্ম্যাট করুন:

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

দেখুন: https://developer.mozilla.org/en/docs/Web/JavaScript/ উল্লেখ / গ্লোবাল_অবজেক্টস / তারিখ / ToLocaleDateString

ফলাফলটি (ব্রাউজারের ভাষা এন-জিবি): 05/12/2016, 14:58


3

// 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);


রেফারেন্সের জন্য: ডেভেলপার.মোজিলা.আর.ইন-options
ইউএস

2

আমি যে সর্বোত্তম সমাধানটি পেয়েছি তা হ'ল [সময় প্রদর্শন = "এলএলএল" ডেটটাইম = "ইউটিসি সময়" /] ট্যাগ তৈরি করা এবং এটি ব্যবহার করার সময় জাভাস্ক্রিপ্ট (জ্যাকোয়ারি) ব্যবহার করে এটি ব্যবহারকারীর সময়ের সাথে সম্পর্কিত display

http://momentjs.com/ Moment.js

সময়টি সুন্দরভাবে প্রদর্শন করবে।


2

আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন, যা GMT থেকে মিনিটের মধ্যে অফসেটের টাইমজোনটি রিপোর্ট করে:

new Date().getTimezoneOffset();

দ্রষ্টব্য: - এই ফাংশনটি একটি নেতিবাচক সংখ্যা প্রদান করে।


1

getTimeZoneOffset () এবং toLocaleString মৌলিক তারিখ কাজের জন্য ভালো, কিন্তু আপনি বাস্তব সময় অঞ্চল সমর্থন, এ বর্ণন প্রয়োজন হলে MDE এর TimeZone.js

এই প্রশ্নের উত্তরে আরও কয়েকটি বিকল্প রয়েছে discussed


1

তারিখটিকে স্থানীয় তারিখে রূপান্তর করতে লোকালডেটস্ট্রিং () পদ্ধতিতে ব্যবহার করুন।

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

স্থানীয় সময়কে রূপান্তর করতে লোকালটাইম স্ট্রিং () পদ্ধতিতে ব্যবহার করুন।

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

-12

কীভাবে লোকেল করবেন তা জানেন না, তবে জাভাস্ক্রিপ্টটি ক্লায়েন্ট সাইড প্রযুক্তি।

usersLocalTime = new Date();

এতে ক্লায়েন্টের সময় এবং তারিখ থাকবে (যেমনটি তাদের ব্রাউজার দ্বারা প্রকাশিত, এবং এক্সটেনশনের মাধ্যমে তারা যে কম্পিউটারে বসেছেন)। প্রতিক্রিয়াতে সার্ভারের সময় অন্তর্ভুক্ত করা এবং অফসেট অনুমান করার জন্য কিছু সাধারণ গণিত করা তুচ্ছ হওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.