반응형

출처 : https://tecsun.medium.com/how-to-reset-anydesk-id-1a6b517460b9

AnyDesk ID 리셋하는 방법?

원격 IT 지원 담당자가 사용자가 없을 때 PC에 자동으로 액세스하는 것을 원하지 않으면 어떻게 해야 합니까?

리셋을 강제하는 간단한 방법이 있습니다. 실행중인 AnyDesk 프로세스(인스턴스)를 종료하고, C:\ProgramData\Anydesk로 갑니다. 당신의 ID와 Alias는 service.conf에 저장되어 있습니다.

저는 어떤 설정 파일이라도 직접 삭제하는 것을 충고하고 싶지 않습니다. 이는 몇년동안 서버를 다루면서 교훈을 얻기 어렵기 때문입니다.

복사본을 백업하는 것은 항상 좋습니다. 그 파일을 service_backup.conf로 변경합니다.

이제 AnyDesk를 실행하면, 새로운 service.conf를 자동으로 생성할 것입니다. 짜잔, 당신의 AnyDesk ID를 보십시오! 당신은 새로운 ID를 얻었습니다!

반응형
반응형

출처 : https://stackoverflow.com/questions/3125645/why-use-select-instead-of-sleep

왜 sleep() 대신에 select()를 사용하나요?

저는 iPhone 오디오에 대한 장을 살펴보고 있는데 이해할 수 없는 코드 섹션을 발견했습니다.

while (aqc.playPtr < aqc.sampleLen) 
{
    select(NULL, NULL, NULL, NULL, 1.0);
}

(전체 코드 샘플은 163-166페이지에 있습니다). 코드에 대해 내가 이해한 바에 따르면 오디오가 다른 스레드에서 처리되고 있고 while 루프는 오디오가 여전히 처리되는 동안 메인 스레드가 종료되는 것을 방지하기 위한 것입니다.

제가 이해할 수 없는 것은 왜 select()sleep() 대신에 사용되었는지 입니다.

내가 읽은 것에서 select()는 I/O의 변경 사항을 모니터링하는 데 사용되며 NULL을 전달해도 의미가 없습니다. sleep()을 사용하여 코드를 실행했으며 예상대로 작동합니다. (저수준 POSIX에 대한 나의 지식은 거의 존재하지 않습니다.)


6개의 답변 중 1 개의 답변

정확한 1초 미만 대기 허용을 선택하고 sleep 보다 이식성이 좋습니다. 대기하는 다른 방법이 있는데 이 질문을 참조하십시오.

그러나 select의 timeout 매개변수는 float가 아니라 struct timeval에 대한 포인터여야 합니다. 나는 당신이 보여주는 코드가 심지어 컴파일된다는 것에 놀랐습니다. More : 이 이상한 조건부 선택 다음에 무조건적인 sleep(1)이 뒤따릅니다. 무의미해 보입니다.

반응형
반응형

참고주소 : https://dev.to/paulasantamaria/change-the-timezone-on-a-heroku-app-2b4

Heroku 앱에서 타임 존(time zone) 변경하기

저는 몇 주 전에 Heroku를 발경하였습니다. 특히 제 팀이 원격으로 개발 환경을 사용하는 무료 플랜이 있기 때문에 당신의 앱을 배포하는 멋진 플랫폼입니다.

최근 저는 새로운 프로젝트 작업을 시작했습니다. 이 특별한 프로젝트에서 주요 연산의 대부분은 날짜와 관련되어 있습니다. 앱은 프론트 엔드를 Angular 5로 만들었고 백 엔드는 Node.js로 만들었습니다.

모든 것은 제 로컬 환경에서 완벽히 작동하였지만 제가 Heroku로 배포하였을 때 모든 날짜 연산은 임의로 작동하기 시작하였습니다.(스포일러: 랜덤은 아닙니다)

여기에 방법이 있습니다. 저는 아르헨티나 출신이고, 로컬 서버에서 배포된 프론트 엔드가 있지만 백엔드는 Heroku에 있고 새로운 Heroku 앱의 기본 지역은 "미국(us)" 이었습니다. 기본적으로 제 프론트 엔드와 백 엔드는 다른 타임 존 이었습니다.

운이 좋게도 Heroku는 우리에게 새로운 설정 변수를 추가함으로서 우리의 앱의 타임 존을 변경할 수 있도록 합니다.

Heroku CLI에서

  1. 명령어 shell을 엽니다.
  2. Heroku로 로그인 합니다.
  3. 당신의 앱 디렉터리를 찻습니다.
  4. 다음처럼 TZ를 설정합니다.
heroku config:add TZ="America/Argentina/Buenos_Aires"

Heroku dashboard(web)에서

  1. 브라우저에서 Heroku dashboard로 로그인 합니다.
  2. 앱을 찻습니다.
  3. Settings 탭을 클릭합니다.
  4. "Reveal Config Vars" 버튼을 누릅니다.
  5. "TZ"를 키로 설정하고 타입 존의 값(예:America/Argentina/Buenos_Aires)을 설정합니다.
  6. Add(추가) 버튼을 누릅니다.

올바른 TZ값인지 어떻게 알 수 있나요

다음 링크에서 타임 존의 전체 목록을 확인할 수 있습니다.

새로운 TZ 값 확인하기

Heroku CLI에서 새로운 설정 변수의 값을 다음 명령어로 확인할 수 있습니다.

heroku config:get TZ

Heroku에 대한 더 많은 정보

Heroku가 무엇입니까?

Heroku 설정 변수에 대한 더 많은 정보

설정 변수

반응형
반응형

출처

https://www.baeldung.com/linux/redirect-output-of-running-process

이미 실행중인 프로세스의 출력을 redirecting 하기

1. 소개

Linux에서 작업할 때 redirections을 사용하는 것은 매우 일반적입니다. 예를 들어, 프로그램을 실행할 수 있고 실행시 생성되는 출력을 침묵시킬 수 있습니다. 그러나 bash는 프로세스가 실행되면 출력을 redirection 하는 직접적인 방법을 제공하지 않습니다. 따라서 이 글에서는 실행중인 프로세스의 출력을 리디렉션하거나 복사하는 다양한 방법에 대해 알아 봅니다. 예를 들어 프로그램을 실행할 때 출력을 리디렉션하는 것을 잊은 경우 유용 할 수 있습니다.

이를 위해 첫 번째는 gdb를 사용하고 다른 하나는 strace를 사용하며 마지막으로 세 번째는 screen을 사용하는 세 가지 방법을 살펴 보겠습니다. 세 번째 접근 방식은 약간 다릅니다.

2. 출력을 redirect하기 위해 gdb 사용하기

gdb_는 리눅스에서 코드 디버깅을 위한 강력한 도구입니다. 그리고 우리는 실행 중인 프로세스에서 코드를 실행하기 위해 그것을 사용할 수 있습니다. 이 경우, *_우리는 실행 중인 프로세스로 _gdb_에 접근(attach)하여 출력을 redirect하기 위해 *gdb 사용할 것이며 작업을 마쳤을 때 실행중인 프로세서로부터 분리(detach)할 것입니다.**

출력을 redirect하기 위해 우리가 할 수 있는 방법은 현재 파일 descriptor를 닫고 그것을 새로운 출력을 가리키도록 다시 여는 것입니다. 우리는 opendup2 함수를 사용하여 이를 할 것입니다.

유닉스 시스템에는 2개의 기본 출력이 있는데, 표준출력*과 *표준에러 입니다. _표준출력_은 파일 descriptor 1과 관련되어 있고 _표준에러_는 파일 descriptor 2와 관련되어 있습니다. 예를 들어, 표준 출력을 redirect하기 원하면 우리는 파일 descriptor 1에서 활동할 필요가 있습니다.

우리는 PID 14560인 프로세스의 출력을 redirect하기 원한다고 가정합시다. 우리는 그 PID로 _gdb_를 접근함으로써 시작해야 합니다.

$ gdb -p 14560

프로세스로 접근했을 때 우리는 파일 descriptor 1을 /tmp/process_stdout로 redirect할 수 있습니다.

(gdb) p dup2(open("/tmp/process_stdout", 1089, 0777), 1)

우리는 숫자 1089를 사용했는데 이는 _O_WRONY | O_CREAT | O_APPEND_를 표현하기 때문이라는 것을 참고하세요.

우리는 표준 출력도 같은 방법으로 파일 descriptor 2를 사용함으로써 정확하게 redirect할 수 있습니다.

(gdb) p dup2(open("/tmp/process_stderr", 1089, 0777), 2)

이 시점에서 출력이 redirect 되었습니다. 그러나 프로세스가 중지되고 _gdb_가 그 프로세스에 접근(attach)합니다.

더 이상 gdb가 필요하지 않으므로 프로세스에서 분리하고 _gdb_를 종료할 수 있습니다. 이렇게하면 프로세스가 계속 실행됩니다.

(gdb) q

또는 /dev/null로 redirect 하여 출력을 침묵시킬 수 있습니다.

(gdb) p dup2(open("/dev/null"), 1)

우리는 모든 gdb 명령을 "명령 파일"로 작성할 수 있고 파라미터 -x 를 사용하여 그것을 실행할 수 있습니다.
gdb_redirect 라 불리는 파일을 생성합시다.

p dup2(open("/tmp/process_stdout", 1089, 0777), 1)
p dup2(open("/tmp/process_stderr", 1089, 0777), 2)
q

다음 우리의 파일 _gdb_redirect_를 사용하여 _gdb_를 실행하면 됩니다.

$ gdb -p 14560 -x gdb_redirect

3. 모든 쓰기 호출을 검사하는 strace 사용하기

우리는 시스템 콜(호출)을 검사하는 strace를 사용할 수도 있습니다. 이 방법은 원래 출력을 중단하지 않습니다. 대신 다른 위치로 복사합니다.
PID 14560의 표준 오류로 쓰는 모든 쓰기를 검사합시다.

$ strace -etrace=write -s 100000 -p 14560 2>&1 | grep --line-buffered '^write(2,'
write(2, "\r", 1)                       = 1
write(2, "17243001856 bytes (17 GB, 16 GiB) copied, 1185 s, 14.6 MB/s", 59) = 59
write(2, "\r", 1)                       = 1
write(2, "17249965568 bytes (17 GB, 16 GiB) copied, 1186 s, 14.5 MB/s", 59) = 59

이 파라미터로 strace*는 *쓰기 호출과 최대 문자열 크기를 10만으로 설정하여 PID 14560에 접근합니다. 그리고 우리는 파일 descriptor 2로 쓰는 것만 출력하기 위해 grep 으로 사용합니다.
우리는 /tmp/process_stderr라 불리는 파일로 이를 redirect할 수 있습니다.

$ strace -etrace=write -s 100000 -p 14560 2>&1 | grep --line-buffered '^write(2,' > /tmp/process_stderr

만약 strace 출력 포멧을 좋아하지 않는다면 문자열만 출력하기 위해 sed를 사용할 수 있습니다.

$ strace -etrace=write -s 100000 -p 14560 2>&1 | sed -n -r 's/^write\(2,\s*"(.+)",\s*[[:digit:]]+\)\s*=\s*[[:digit:]]+$/\1/p'
\r
25754656256 bytes (26 GB, 24 GiB) copied, 1710 s, 15.1 MB/s
\r
25761747456 bytes (26 GB, 24 GiB) copied, 1711 s, 15.1 MB/s

또한 ** strace는 16진수와 파일 descriptor로 쓰여진 아스키코드로 출력할 수 있습니다.** 우리는 이를 -ewrite=fd 옵션을 사용하여 할 수 있습니다.

$ strace -ewrite=2 -etrace=write -p 14560 2>&1 | grep  --line-buffered '^ |'
 | 00000  0d                                                .                |
 | 00000  33 33 30 31 32 30 32 37  39 30 34 20 62 79 74 65  33012027904 byte |
 | 00010  73 20 28 33 33 20 47 42  2c 20 33 31 20 47 69 42  s (33 GB, 31 GiB |
 | 00020  29 20 63 6f 70 69 65 64  2c 20 32 31 36 32 20 73  ) copied, 2162 s |
 | 00030  2c 20 31 35 2e 33 20 4d  42 2f 73                 , 15.3 MB/s      |
 | 00000  0d                                                .                |
 | 00000  33 33 30 31 39 36 32 31  38 38 38 20 62 79 74 65  33019621888 byte |
 | 00010  73 20 28 33 33 20 47 42  2c 20 33 31 20 47 69 42  s (33 GB, 31 GiB |
 | 00020  29 20 63 6f 70 69 65 64  2c 20 32 31 36 33 20 73  ) copied, 2163 s |
 | 00030  2c 20 31 35 2e 33 20 4d  42 2f 73                 , 15.3 MB/s      |

4. screen을 사용하여 파일에 출력 쓰기

프로세스가 스크린 세션 내에서 실행 중인 경우 현재 창을 파일에 기록할 수 있습니다. strace와 마찬가지로 출력을 대체하지 않고 대신 복사합니다. 그러나 임의의 파일 descriptor를 복사 할 수 없습니다. 화면 창에 기록 중인 내용만 복사할 수 있습니다.

이를 위해 screen 명령 로그 또는 핫키 C-a H를 사용합니다. 그러면 화면 창 번호가 n 인 screenlog.n이라는 파일에 로깅이 활성화됩니다. 그런 다음 화면에서 분리하여 프로세스를 실행하면 screenlog.n에서 출력을 볼 수 있습니다. log 명령이나 핫키를 다시 사용하여 언제든지 로그인을 중지 할 수 있습니다.

또한 logfile 명령을 사용하여 출력을 작성할 위치를 지정할 수 있습니다.

:logfile process_output

그런 다음 log를 실행하면 출력이 screenlog.n 대신 process_output에 표시됩니다.

동영상 링크

5. 결론

이 글에서는 이미 실행중인 프로세스의 출력을 redirect 하는 세 가지 방법을 살펴 보았습니다.

먼저 gdb를 사용하여 현재 출력을 새 출력으로 대체했습니다. 그런 다음 *strace로 *쓰기 위한 모든 호출을 가로 채서 원하는 출력을 다른 위치에 복사했습니다. 마지막으로 창을 파일에 기록하는 screen을 활용했습니다.

반응형
반응형

출처

https://stackoverflow.com/questions/32029647/warning-feof-expects-parameter-1-to-be-resource-boolean-given-in-volume1-we

경고 : feof()는 첫 번째 매개 변수가 리소스가 될 것으로 예상합니다. 하지만은 /volume1/web/comment.php 62행에 boolean 타입입니다.

저는 youtube와 다른 사이트의 도움으로 코드를 학습하기 시작했습니다만, 문제에 직면하였습니다. 여기에 제 코드입니다.

<form action="" method="post" id="c">
  <label> Name: <br><input type="text" name="name" size="36"></label><br></br>
  <label> Message: <br><textarea cols="35" rows="5" name="mes"></textarea></label><br></br>
  <input type="submit" name="submit" value="Submit" class="texty" >
</form>

<?php
$post = $_POST["post"];
$name = $_POST["name"];
$text = $_POST["mes"];

if ($post) {

    #WRITE DOWN COMMENTS#

    $write = fopen("c.txt", "a+");
    fwrite($write, "<u><b> $name</b></u><br>$text<br></br>");
    fclose($write);

    #DISPLAY COMMENTS#

    $read = fopen("c.txt", "r+t");
    echo "All comments:<br>";

    while (!feof($read)) {   #this line does the error#
        echo fread($read, 1024);
    }
    fclose($read);
}
else{
    #DISPLAY COMMENTS#

    $read = fopen("c.txt", "r+t");
    echo "All comments:<br>";

    while (!feof($read)) {
        echo fread($read, 1024);
    }
    fclose($read);
}
?>

그래서 2개의 파일이 있는데, 하나는 당신이 코멘트를 입력하고 그것을 게시하는 곳이고, 다른 하나는 당신이 입력한 것을 붙여 넣은 다음 페이지에 다시 출력되는 .txt 파일입니다. 파일 권한에 문제가 있는 것 같습니다. "r"에만 입력하면 오류가 발생하지 않지만 게시하려는 내용이 저장되지 않기 때문입니다. 감사합니다. 읽고 답장해 주셔서 감사합니다.


2 개의 답변 중 1 개의 답변만 추려냄.

fopen은 파일을 열 수 없는 경우 부울(FALSE) 타입을 반환합니다. feof에 전달하기 전에 $read가 false가 아닌지 확인해야 합니다. 그리고 왜 파일을 읽을 수 없는지 알아 내십시오.

if ($read) {
    ...

권한으로 인해 또는 파일 자체를 찾을 수 없는 경우 파일을 읽을 수 없습니다. c.txt를 참조하고 있지만 PHP가 있는 동일한 디렉토리에 있습니까? getcwd를 사용하여 PHP가 어떤 디렉토리에 있는지 확인할 수 있습니다.

echo getcwd ()

또한 form 핸들러는 $_POST[ 'post']에 값이 있지만 해당 이름이 form에서 사용되지 않는 경우에만 쓰기 분기문에 들어갑니다 (적어도 표시된 예제에서는 사용되지 않았습니다).

반응형
반응형

참고주소 : https://stackoverflow.com/questions/8318236/regex-pattern-for-hhmmss-time-string

HH:MM:SS 시간 문자열에 대한 정규식 패턴

저는 hh:mm:ss 문자열을 파싱하고 싶습니다. 간단한 방법은 2:3:24 또는 02:03:24 문자열이 기대되는 ([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)입니다.

저는 더 단계를 진행하고 싶고 다음과 같은 경우에 유효성을 통과하는지 알고 싶습니다.

  1. 56만 입력할 경우, 통과해야하며, 56은 56초 [SS]로 고려될 수 있습니다.
  2. 2:3 또는 02:03 또는 02:3 또는 2:03을 입력해도 통과해야 합니다. 2분 3초 [MM:SS]의 의미입니다.
  3. 20:30:12를 입력하면 20시 30분 12초 [HH:MM:SS]라는 의미로 통과합니다.
  4. 78:12를 입력하면 78분은 틀렸기 때문에 통과할 수 없습니다.

기본적으로 ":"이 발견되면, ":" 앞에 숫자는 MM으로, ":" 뒤의 숫자는 SS로 간주합니다. 두 개의 ":"이 발견되면 HH:MM:SS로 갅주합니다.

전 이 패턴을 생각해 냈습니다.

(^([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)$)|(^([0-5]?\d):([0-5]?\d)$)|(^[0-5]?\d$)

잘 작동하는 것 같습니다. 저는 이 작업을 할 수 있는 다른 더 간단한 정규식을 알고 싶습니다.


2개 답변 중 1개

^(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)$

설명:

^                   # 문자열의 시작
(?:                 # 맞는가 시도...
 (?:                #  맞는가 시도...
  ([01]?\d|2[0-3]): #   HH:
 )?                 #  (옵션으로).
 ([0-5]?\d):        #  MM: (필수)
)?                  # (그룹 전체가 옵션, 그래서 HH:MM: 또는 MM: 또는 없음의 의미)
([0-5]?\d)          # SS (필수)
$                   # 문자열의 끝
반응형
반응형

출처 : https://en.wikipedia.org/wiki/Stunnel

Stunnel

Stunnel은 보편적인 TLS/SSL 터널링 서비스에 사용되는 오픈 소스 멀티 플랫폼 응용프로그램입니다.

Stunnel은 TLS 또는 SSL을 사용하지 않는 클라이언트 또는 서버에 암호화된 보안 연결을 제공하는 데 사용할 수 있습니다. 이 프로그램은 유닉스와 비슷한 운영체제 대부분과 윈도우즈를 포함하여 다양한 운영체제에서 실행됩니다. Stunnel은 OpenSSL 라이브러리를 사용하여 TLS 또는 SSL 프로토콜을 구현합니다.

Stunnel은 SSL 접속을 보안 연결하기 위해 X.509 디지털 인증서로 공개키 암호를 사용합니다. 클라이언트는 선택적으로 인증서를 통해 인증 받을 수 있습니다.

libwrap에 대해 링크된 경우, 프록시-방화벽 서비스로도 작동하도록 구성할 수 있습니다.

Stunnel은 Michal Trojnara에 의해 관리되고 있고 OpenSSL을 제외하고 GNU GPL (General Public License) 조건에 따라 릴리스됩니다.

시나리오 예시

예를 들어, SSL이 아닌 SMTP 메일 서버로 SSL 보안 연결을 제공하기 위해 stunnel을 사용할 수 있습니다. SMTP 서버는 25번 포트로 TCP 접속을 한다 가정하면, stunnel에 SSL 포트로 465로 설정하고 SSL이 아닌 포트를 25로 설정합니다. 메일 클라이언트는 SSL을 통해 포트 465로 접속합니다. 클라이언트의 네트워크 트래픽은 stunnel 응용프로그램으로 SSL을 통해 전달되어 트래픽을 투명하게 암호화 / 복호화하고 보안되지 않은 트래픽을 포트 25로 로컬로 전달합니다. 메일 서버는 비 SSL 메일 클라이언트로 봅니다.

stunnel 프로세스는 보안이 적용되지 않은 메일 애플리케이션과 동일하거나 다른 서버에서 실행될 수 있습니다. 그러나 두 시스템은 일반적으로 보안 내부 네트워크의 방화벽 뒤에 있습니다 (침입자가 포트 25에 직접 보안되지 않은 연결을 만들 수 없음).

반응형
반응형

출처 : https://stackoverflow.com/questions/19461744/how-to-make-parent-wait-for-all-child-processes-to-finish

부모가 모든 자식 프로세스가 끝날 때까지 기다리는 방법?

저는 fork를 계속하기 전에 부모가 모든 자식 프로세스가 끝날 때까지 기다리는 방법을 밝힐 수 있기를 바랍니다. 실행하려는 정리 코드가 있지만 이러한 일이 발생하기 전에 자식 프로세스가 반환되어야 합니다.

for (int id=0; id<n; id++) {
  if (fork()==0) {
    // 자식
    exit(0);
  } else {
    // 부모
    ...
  }
  ...
}

3개의 답변 중 1개의 답변

pid_t child_pid, wpid; 
int status = 0; 

// 아버지 코드 (자식 프로세스가 시작하기 전에) 

for (int id=0; id<n; id++) { 
    if ((child_pid = fork()) == 0) { 
        // 자식 코드
        exit(0); 
    } 
} 

while ((wpid = wait(&status)) > 0); // 이 방법으로 아버지는 모든 자식 프로세스를 기다립니다.

// 아버지 코드 (모든 자식 프로세스가 끝난 후에)

wait 는 하위 프로세스가 종료 될 때까지 대기하고 해당 하위 프로세스의 pid를 리턴합니다. 오류가 발생하면 (예 : 하위 프로세스가 없는 경우) -1이 반환됩니다. 따라서 기본적으로 코드는 wait(대기) 오류가 끝날 때까지 자식 프로세스가 완료될 때까지 계속 기다렸다가 모두 완료되었음을 알 수 있습니다.

반응형
반응형

출처

"함수는 일급 객체이다." 는 정확히 무슨 의미입니까?

누군가 뭔가 좋은 예시로 분명하게 설명해주실 수 있나요? 저는 함수 프로그래밍에 관해 설명할 때 이 문장을 Scala에서 보았습니다.

6개의 답변 중 1개의 답변만 추려냄

"일급"은 공식적으로 정의된 표현은 아닙나다만, 3가지 속성을 가지는 entity로 다음 일반적인 의미가 있습니다.

  1. 그것은 "일반적인" 값을 함수에 전달되거나 함수로 컨테이너 안으로 넣는 등 제한없이 사용될 수 있습니다.
  2. 그것은 "일반적인" 값을 표현식 등으로 지역변수 형태로 제한없이 생성될 수 있습니다.
  3. 그것은 "일반적인" 값과 유사한 방식으로 입력할 수 있습니다. 해당 entity처럼 지정된 타입이 있고 다른 타입으로 자유롭게 구성될 수 있습니다.

함수는 (2) 특별하게 지역 함수는 scope안에 모든 이름을 사용할 수 있습니다. 예를 들면 closure가 있습니다. 그것은 (익명함수처럼) 생성될 때 익명의 형태로 나타날 수 있습니다. 하지만 엄격하게 요구되지는 않습니다. (예시: 언어는 일반적으로 let-표현식으로 충분합니다.) (3)은 타입이 없는 언어에서 사실입니다.

그래서 Scala(와 함수형 언어)에서 왜 함수가 일급으로 불리는지 알 수 있습니다. 여기에는 다른 예시가 있습니다.

  • C/C++의 함수는 일급이 아닙니다. (1)과 (3)은 함수 포인터로 가능하지만 (2)는 함수에서 적절하게 제공되지 않습니다. (이점이 자주 간과됩니다)
  • 똑같이, C에서 배열과 구조체는 일급이 아닙니다.
  • Scala의 Class는 일급이 아닙니다. 당신은 Class를 정의하고 내포(nest)할 수 있지만, 함수(오직 그것의 객체)로 그들을 전달할 수 없습니다. 일급 클래스를 갖춘 객체지향 언어가 있고 Scala의 디자인은 nuObj calculus라 불리는 방법으로 그것을 허용합니다.
  • 일급 모듈은 ML같은 언어에서 종종 필요한 기능입니다. 결정할 수 없는 타입 검사로 이끌기 때문에 그것은 어렵습니다. ML dialect는 일급 객체로 wrap되는 것을 허용합니다만 그들 자체를 일급 클래스 모듈로 만들지는 않습니다.
반응형
반응형

출처
https://stackoverflow.com/questions/19074552/converting-utc-to-a-different-time-zone-in-php

PHP에서 UTC 시간 대를 다른 시간 대로 변환하기

저는 UTC 시간대를 다른 시간대로 변환하기 위해 아래의 메소드를 사용하였습니다. 하지만 아래의 메소드는 UTC 시간을 리턴하는 것으로 보입니다. 제가 사용한 메소드에 잘못된 것이 무엇인지 충분히 알려주실 수 있으신가요?

static function formatDateMerchantTimeZone($t, $tz) {
   if (isset($t)) {
       return date('Y-m-d H:i:s', strtotime($t , $tz));
   } else {
       return null;
   }
}

$t는 제가 전달한 datetime입니다.
$tz는 America/Los_Angeles와 같은 시간대 입니다.


4개의 답변 중 2개의 답변

많은 사람들이 DateTime 클래스를 인지하지 못하거나 사용하지 않는다는 사실에 놀랐습니다. DateTime 클래스는 이와 같은 작업을 거의 사소하게 만듭니다.

함수에 전달하는 날짜 문자열이 UTC 시간대에 있다고 가정했습니다.

function formatDateMerchantTimeZone($t, $tz)
{
    $date = new \DateTime($t, new \DateTimeZone('UTC'));
    $date->setTimezone(new \DateTimeZone($tz));
    return $date->format('Y-m-d H:i:s');
}

작동 확인


다음을 시도해보세요.

<?php
/**    초 단위로 origin 시간대에서 remote 시간대의 offset을 리턴합니다..
*    @param $remote_tz;
*    @param $origin_tz; null 이면 서버의 현재 시간대가 origin 으로 사용됩니다.
*    @return int;
*/
function get_timezone_offset($remote_tz, $origin_tz = null) {
    if($origin_tz === null) {
        if(!is_string($origin_tz = date_default_timezone_get())) {
            return false; // UTC 타임스탬프가 반환되었습니다 -- 탈출!
        }
    }
    $origin_dtz = new DateTimeZone($origin_tz);
    $remote_dtz = new DateTimeZone($remote_tz);
    $origin_dt = new DateTime("now", $origin_dtz);
    $remote_dt = new DateTime("now", $remote_dtz);
    $offset = $origin_dtz->getOffset($origin_dt) - $remote_dtz->getOffset($remote_dt);
    return $offset;
}
?>
사용예시:
<?php
// 이는 10800을 리턴합니다 (3시간) ...
$offset = get_timezone_offset('America/Los_Angeles','America/New_York');
// 또는 이미 서버 시간이 'America/New_York'로 설정되어 있다면...
$offset = get_timezone_offset('America/Los_Angeles');
// $offset 값을 취해서 당신의 timestamp 값을 조절할 수 있습니다.
$offset_time = time() + $offset;
?>
반응형

+ Recent posts