Я нашел способ конвертировать временную метку Unix в дату Excel.
$date_time = "2013-11-01 00:00:00";
$date_time_plus_one = strtotime($date_time . ' +1 day');
$str_date = strtotime(date('Y-m-d', $date_time_plus_one));
$excel_date = intval(25569 + $str_date / 86400);
echo 'php actual date time : ' . $date_time . '<br>';
echo 'add one day : ' . $date_time_plus_one . '<br>';
echo 'excel Number DATEVALUE : ' . $excel_date . '<br>';
секунд в день: 86400, 25569 дней между 30 декабря 1899 года и 01 января 1970 года. Таким образом, это результат .
php фактическое время: 2013-11-01 00:00:00
добавить один день: 1383330600
excel Number DATEVALUE: 41579
blockquote>
Что происходит в этом случае? будет ли утечка памяти?
blockquote>Это утечка ресурсов. Соединение может оставаться открытым, и в этом случае дескриптор файла не будет освобожден.
Также безопасно ли вставить defer resp.Body.Close () сразу после получения объекта ответа?
blockquote>Нет, следуйте примеру, приведенному в документацию и закрыть ее сразу после проверки ошибки.
client := http.DefaultClient resp, err := client.Do(req) if err != nil { return nil, err } defer resp.Body.Close()
Из документации
http.Client
:При ошибке любой ответ можно игнорировать. Ответ на не-nil с ошибкой non-nil возникает только тогда, когда CheckRedirect терпит неудачу, и даже тогда возвращенный Response.Body уже закрыт.
blockquote>
Сначала дескриптор никогда не закрывается, как указано выше.
Кроме того, golang будет кэшировать соединение (используя persistConn
struct для переноса) для повторного использования, если DisableKeepAlives
является ложным .
В golang после использования client.Do
метод go выполнит goroutine readLoop
метод как один из шагов.
Итак, в golang http transport.go
, pconn(persistConn struct)
не будет помещаться в канал idleConn
, пока req не будет отменен в методе readLoop
, а также этот goroutine (метод readLoop
) будет заблокирован до тех пор, пока req не будет отменен.
Здесь это код , показывающий его.
Если вы хотите узнать больше, вам нужно увидеть метод readLoop
.
См. https://golang.org/src/net/http/client.go «Когда err равно nil, resp всегда содержит non-nil resp.Body."
, но они не говорят, когда err! = nil, resp всегда равно нулю. Далее они говорят: «Если resp.Body не закрыт, базовый RoundTripper (обычно Transport) Клиента, возможно, не сможет повторно использовать постоянное TCP-соединение с сервером для последующего запроса« keep-alive »».
Поэтому я, как правило, решил проблему следующим образом:
client := http.DefaultClient
resp, err := client.Do(req)
if resp != nil {
defer resp.Body.Close()
}
if err != nil {
return nil, err
}
Если Response.Body
не будет закрыт с помощью метода Close()
, чем ресурсы, связанные с fd, не будут освобождены. Это утечка ресурса.
Response.Body
Ответственность вызывающего абонента для закрытия тела.
blockquote>Таким образом, нет финализаторов, связанных с объектом, и он должен быть явно закрыт.
Обработка ошибок и отложенные очистки
При ошибке любой ответ можно игнорировать. Ответ на не-nil с ошибкой non-nil возникает только тогда, когда CheckRedirect терпит неудачу, и даже тогда возвращенный Response.Body уже закрыт.
blockquote>resp, err := http.Get("http://example.com/") if err != nil { // Handle error if error is non-nil } defer resp.Body.Close() // Close body only if response non-nil
io.LimitReader
. Обычно я использую довольно небольшой предел, так как быстрее устанавливать новое соединение, если запрос слишком велик. – JimB 9 January 2017 в 15:26