Местное время для UTC и UTC для локального на основе определенного смещения часового пояса [дубликат]

Поставщик данных .NET - относительный путь по умолчанию - стандартное соединение

 using System.Data.SqlClient;
 var conn = new SqlConnection();
 conn.ConnectionString = 
 "Data Source=.\SQLExpress;" + 
 "User Instance=true;" + 
 "User Id=UserName;" + 
 "Password=Secret;" + 
 "AttachDbFilename=|DataDirectory|DataBaseName.mdf;"conn.Open();

Поставщик данных .NET - относительный путь по умолчанию - доверенное соединение

 using System.Data.SqlClient;
 var conn = new SqlConnection();
 conn.ConnectionString = 
 "Data Source=.\SQLExpress;" + 
 "User Instance=true;" + 
 "Integrated Security=true;" + 
 "AttachDbFilename=|DataDirectory|DataBaseName.mdf;" conn.Open();

. NET Поставщик данных - Пользовательский относительный путь - Стандартное соединение

using System.Data.SqlClient;
AppDomain.CurrentDomain.SetData(
"DataDirectory", "C:\MyPath\");
 var conn = new SqlConnection();
 conn.ConnectionString = 
 "Data Source=.\SQLExpress;" + 
 "User Instance=true;" + 
 "User Id=UserName;" + 
 "Password=Secret;" + 
"AttachDbFilename=|DataDirectory|DataBaseName.mdf;" conn.Open();  

Поставщик данных .NET - Пользовательский относительный путь - Надежное соединение

 using System.Data.SqlClient;
 AppDomain.CurrentDomain.SetData(
 "DataDirectory", "C:\MyPath\");
 var conn = new SqlConnection();
 conn.ConnectionString = 
 "Data Source=.\SQLExpress;" + 
 "User Instance=true;" + 
 "Integrated Security=true;" + 
 "AttachDbFilename=|DataDirectory|DataBaseName.mdf;" conn.Open();
97
задан pavanred 28 February 2013 в 19:22
поделиться

7 ответов

Я столкнулся с аналогичной проблемой с модульными тестами (особенно в шутке, когда модульные тесты запускаются локально для создания моментальных снимков, а затем сервер CI запускает (потенциально) другой часовой пояс, что приводит к сбою сравнения моментальных снимков). Я издевался над нашими Date и некоторыми вспомогательными методами:

describe('...', () => {
  let originalDate;

  beforeEach(() => {
    originalDate = Date;
    Date = jest.fn(
      (d) => {
        let newD;
        if (d) {
          newD = (new originalDate(d));
        } else {
          newD = (new originalDate('2017-05-29T10:00:00z'));
        }
        newD.toLocaleString = () => {
          return (new originalDate(newD.valueOf())).toLocaleString("en-US", {timeZone: "America/New_York"});
        };
        newD.toLocaleDateString = () => {
          return (new originalDate(newD.valueOf())).toLocaleDateString("en-US", {timeZone: "America/New_York"});
        };
        newD.toLocaleTimeString = () => {
          return (new originalDate(newD.valueOf())).toLocaleTimeString("en-US", {timeZone: "America/New_York"});
        };
        return newD;
      }
    );
    Date.now = () => { return (Date()); };
  });

  afterEach(() => {
    Date = originalDate;
  });

});
1
ответ дан JRulle 21 August 2018 в 23:34
поделиться

Вы можете указать смещение часового пояса на new Date(), например:

new Date('Feb 28 2013 19:00:00 EST')

или

new Date('Feb 28 2013 19:00:00 GMT-0500')

Поскольку Date сохраняет время UTC (т. е. getTime возвращается в UTC), javascript преобразует время в UTC, и когда вы вызываете такие вещи, как toString, javascript преобразует время UTC в локальный часовой пояс браузера и возвращает строку в локальном часовом поясе, то есть, если я использую UTC+8:

> new Date('Feb 28 2013 19:00:00 GMT-0500').toString()
< "Fri Mar 01 2013 08:00:00 GMT+0800 (CST)"

Также вы можете использовать обычный метод getHours/Minute/Second:

> new Date('Feb 28 2013 19:00:00 GMT-0500').getHours()
< 8

(Этот параметр 8 означает, что после преобразования времени в мое местное время - UTC+8, число часов - 8.)

11
ответ дан maowtm 21 August 2018 в 23:34
поделиться
  • 1
    Анализ любого формата, кроме расширенного формата ISO 8601, зависит от реализации, и на него нельзя положиться. Нет стандарта для сокращений времени, например. & Quot; EST & Quot; может представлять собой любую из трех разных зон. – RobG 6 December 2016 в 05:36
  • 2
    Примеры в этом комментарии часто не работают в Internet Explorer. Как уже упоминалось в предыдущем комментарии к этому сообщению, важна ИСО 8601. Я подтвердил, прочитав спецификацию языка ECMA-262 (Javascript 5th). – Dakusan 7 September 2017 в 23:24

Попробуйте: date-from-timezone , он разрешает ожидаемую дату с помощью изначально доступных Intl.DateTimeFormat.

Я использовал этот метод в одном из моих проектов в течение нескольких лет уже, но теперь я решил опубликовать его как небольшой проект ОС:)

0
ответ дан Mariusz Nowak 21 August 2018 в 23:34
поделиться

Фон

Объект JavaScript Date JavaScript отслеживает время в UTC внутренне, но обычно принимает вход и выход в локальное время компьютера, на котором он запущен. У этого нет никаких средств для работы со временем в других часовых поясах. Вы можете анализировать и выводить даты, которые являются UTC или Local, но вы не можете напрямую работать с другими часовыми поясами.

Чтобы быть абсолютно точным, внутреннее представление объекта Date - это единственное число, представляя количество миллисекунд, прошедших с момента 1970-01-01 00:00:00 UTC, независимо от секунд прыжка. В объекте Date нет часового пояса или строкового формата. Когда используются различные функции объекта Date, локальный часовой пояс компьютера применяется к внутреннему представлению. Если функция выдает строку, тогда локальная информация компьютера может быть принята во внимание, чтобы определить, как создать эту строку. Информация зависит от каждой функции, а некоторые из них специфичны для реализации.

Библиотеки

К счастью, есть библиотеки, которые могут это сделать. Они реализуют стандартную базу данных о часовых поясах Olson / IANA в JavaScript. У некоторых есть накладные расходы, если вы работаете в веб-браузере, так как база данных может быть немного большой, если вы хотите все это. К счастью, многие из этих библиотек позволяют выборочно выбирать зоны, которые вы хотите поддерживать, делая размер данных более приемлемым. Некоторые из них используют современные функции для получения данных о часовых поясах из API Intl, а не для их отправки.

Для этого есть несколько библиотек:

Luxon, вероятно, является самой безопасной ставкой для всего современного использования и является самым легким весом, поскольку он использует API Intl для его данные о часовом поясе.

Момент-часовой пояс является расширением moment.js и приводит к его собственным данным часового пояса.

js-joda - это JavaScript реализация Joda-Time API (с Java) и включает поддержку часового пояса через отдельный модуль.

BigEasy / TimeZone также находится на правильном пути.

WallTime- js достиг конца жизни , а владельцы мигрируют в момент-время.

TimeZoneJS был вокруг самого длинного, но, как известно, имеют некоторые давние ошибки, особенно при переходах на летнее время. Надеюсь, они будут исправлены в какой-то момент в будущем.

tz.js также существует некоторое время, но не очень хорошо документировано, IMHO.

Вы должны оценить эти библиотеки, чтобы увидеть, что будет отвечать вашим потребностям. Если вы не уверены, перейдите с моментом / моментом-временем.

Встроенная поддержка в современных браузерах

Если вы можете ограничить свое использование в современных веб-браузерах, теперь вы можете сделать следующее без каких-либо специальных Библиотеки:

new Date().toLocaleString("en-US", {timeZone: "America/New_York"})

Это не комплексное решение, но оно работает для многих сценариев, которые требуют только преобразования вывода (от UTC или местного времени до определенного часового пояса, но не в другом направлении). Это часть API интернационализации ECMAScript (ECMA-402). Подробнее см. В этой записи . Эта таблица совместимости отслеживает, какие версии поддерживаются. Это API Intl, упомянутый выше, что некоторые библиотеки теперь используют внутренне.

161
ответ дан Matt Johnson 21 August 2018 в 23:34
поделиться
  • 1
    Пожалуйста, измените & quot; представлять & quot; к «output / parse», поскольку временные метки представлены независимы от времени – Bergi 4 March 2013 в 20:39
  • 2
    @Bergi - Я переосмыслил это и согласен с вами. Обновил мой ответ соответственно. – Matt Johnson 17 June 2013 в 15:37
  • 3
    @CyberneticTwerkGuruOrc - Обновлено. Благодаря! – Matt Johnson 12 June 2014 в 21:30
  • 4
    Когда вы делаете это в консоли Firebug: var date_time = new Date(), значение date_time (для меня в AEST) Date {Sun Aug 21 2016 22:18:47 GMT+1000 (AEST)}, и поэтому кажется, что имеет хранит часовой пояс. Как я могу обеспечить date_time чисто время UTC без включения часового пояса? – user1063287 21 August 2016 в 12:22
  • 5
    @ user1063287-метод toString использует смещение часового пояса хоста для создания даты и времени в "локальном" часовой пояс. Сам объект даты имеет значение времени, которое является смещением от 1970-01-01T00: 00: 00Z, так эффективно UTC. Чтобы увидеть дату и время UTC, используйте toISOString . – RobG 23 August 2016 в 22:47

Столкнулся с той же проблемой, использовал этот

Console.log (Date.parse («13 июня 2018 10:50:39 GMT + 1»));

Он вернет миллисекунды, к которым вы можете проверить, есть +100 timzone intialize британское время Надеюсь, что это поможет !!

-1
ответ дан sandeep kumar 21 August 2018 в 23:34
поделиться
  • 1
    (Этот пост, похоже, не дает ответа на вопрос качества . Пожалуйста, отредактируйте свой ответ или просто опубликуйте его как комментарий к вопросу). – sɐunıɔןɐqɐp 14 June 2018 в 06:28

Я знаю его 3 года слишком поздно, но, может быть, он может помочь кому-то другому, потому что я нашел что-то подобное, кроме библиотеки времени и времени, что не совсем то же самое, что и просьбы здесь.

ive сделал что-то подобное для немецкого часового пояса, это немного сложно из-за летнего времени и високосных лет, когда у вас есть 366 дней.

ему может потребоваться небольшая работа с функцией isDaylightSavingTimeInGermany, разные временные интервалы изменяются в разное время перехода на летнее время.

в любом случае, посмотрите эту страницу: https://github.com/zerkotin/german-timezone-converter/wiki

основными методами являются: convertLocalDateToGermanTimezone convertGermanDateToLocalTimezone

ive прилагает усилия к документированию, поэтому он не будет настолько запутанным.

2
ответ дан zerkotin 21 August 2018 в 23:34
поделиться
0
ответ дан Sandeep Chowdary 4 November 2018 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: